From 5e4636b54d71789b516cb67a4039bbbc92e00192 Mon Sep 17 00:00:00 2001 From: Dylan Player Date: Tue, 18 Aug 2026 10:20:55 -0700 Subject: [PATCH] Reapply "Migrate app identity to Codevisor, LLC (com.codevisor.*)" This reverts commit 5211b6e49257edbbaa92035cefbb837c2213123c. --- .swiftlint-baseline.json | 2 +- apps/ios/Codevisor.xcodeproj/project.pbxproj | 4 +- .../IOSNavigationDiagnostics.swift | 2 +- apps/ios/Codevisor/Info.plist | 2 +- .../macos/Codevisor.xcodeproj/project.pbxproj | 10 +++-- apps/macos/Codevisor/ContentView.swift | 4 ++ .../Updates/MacServerAgentController.swift | 19 +++++++++- .../com.codevisor.macos.ServerAgent.plist | 18 +++++++++ apps/macos/ERROR_HANDLING_AUDIT.md | 8 ++-- apps/www/public/install.sh | 3 ++ docs/ios-app-plan.md | 4 +- .../swift/ACPKit/Sources/ACPKit/Logging.swift | 2 +- .../CodeHighlighter/CodeHighlighter.swift | 2 +- .../Sources/CodevisorClient/AppVariant.swift | 5 ++- .../LegacyDefaultsMigration.swift | 31 +++++++++++++++ .../Sources/CodevisorClient/Logging.swift | 4 +- .../LegacyDefaultsMigrationTests.swift | 38 +++++++++++++++++++ .../Server/LegacyServerJobRetirer.swift | 5 +++ .../Sources/CodevisorTheming/Logging.swift | 2 +- .../Parser/InlineMarkdown.swift | 2 +- .../Views/InlineCodeChipAttribute.swift | 2 +- .../Views/SelectableTextView+UIKit.swift | 2 +- .../Views/SelectableTextView.swift | 2 +- .../Views/StreamingTextAnimation.swift | 2 +- scripts/dev-ios.mjs | 2 +- scripts/dev.mjs | 2 +- scripts/release/build-macos-app.sh | 20 ++++++---- scripts/release/update-homebrew-tap.mjs | 29 ++++++++------ 28 files changed, 181 insertions(+), 47 deletions(-) create mode 100644 apps/macos/Codevisor/LaunchAgents/com.codevisor.macos.ServerAgent.plist create mode 100644 packages/swift/CodevisorClient/Sources/CodevisorClient/LegacyDefaultsMigration.swift create mode 100644 packages/swift/CodevisorClient/Tests/CodevisorClientTests/LegacyDefaultsMigrationTests.swift diff --git a/.swiftlint-baseline.json b/.swiftlint-baseline.json index e35bf96c..293be959 100644 --- a/.swiftlint-baseline.json +++ b/.swiftlint-baseline.json @@ -1 +1 @@ -[{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Composer\/ComposerAttachments.swift"},"ruleIdentifier":"file_name"}},{"text":"struct ComposerBar: View {","violation":{"ruleName":"Type Body Length","severity":"warning","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Composer\/ComposerBar.swift","line":17},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 497 lines","ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","severity":"warning","location":{"character":1,"line":894,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Composer\/ComposerBar.swift"},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 670"}},{"text":"struct HomeView: View {","violation":{"ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 1445 lines","severity":"error","ruleName":"Type Body Length","location":{"line":10,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Home\/HomeView.swift","character":1}}},{"text":"}","violation":{"reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1455","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","severity":"error","ruleName":"File Length","location":{"line":1729,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Home\/HomeView.swift"}}},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","ruleName":"File Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Onboarding\/OnboardingView.swift","line":651,"character":1},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 532","ruleIdentifier":"file_length","severity":"warning"}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/AttachmentPreviews.swift"}}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/NewChatPresentation.swift","line":1}}},{"text":"","violation":{"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/SessionScreen.swift"},"reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"struct SessionTranscriptView: View {","violation":{"ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","location":{"character":1,"line":16,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/SessionScreen.swift"},"severity":"warning","ruleName":"Type Body Length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 426 lines"}},{"text":"final class VirtualizedTranscriptScrollView: UIScrollView, UIScrollViewDelegate {","violation":{"ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","ruleName":"Type Body Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/VirtualizedTranscriptScrollView.swift","line":11,"character":7},"severity":"error","reason":"Class body should span 800 lines or less excluding comments and whitespace: currently spans 1363 lines"}},{"text":"}","violation":{"location":{"line":1544,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/VirtualizedTranscriptScrollView.swift"},"ruleIdentifier":"file_length","ruleName":"File Length","severity":"error","reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1371","ruleDescription":"Files should not span too many lines."}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Terminal\/TerminalScreen.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","severity":"warning"}},{"text":"struct WorkspaceScreen: View {","violation":{"ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines","severity":"error","location":{"line":13,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Workspace\/WorkspaceScreen.swift","character":1},"ruleName":"Type Body Length","reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 1215 lines"}},{"text":"}","violation":{"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","severity":"error","location":{"line":1510,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Workspace\/WorkspaceScreen.swift","character":1},"ruleName":"File Length","reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1221"}},{"text":"","violation":{"ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/ContentView.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name"}},{"text":"}","violation":{"severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 587","ruleIdentifier":"file_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/ContentView.swift","character":1,"line":731},"ruleDescription":"Files should not span too many lines.","ruleName":"File Length"}},{"text":"","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/DesignSystem\/HoverTracking.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","severity":"warning"}},{"text":"","violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/DesignSystem\/ThemedRootModifier.swift"},"ruleDescription":"File name should match a type or extension declared in the file (if any)","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleIdentifier":"file_name","ruleName":"File Name"}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/DesignSystem\/TitlebarSeparatorModifier.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/ComposerView.swift"},"reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name"}},{"text":"struct ComposerCard: View {","violation":{"ruleDescription":"Type bodies should not span too many lines","severity":"warning","ruleName":"Type Body Length","ruleIdentifier":"type_body_length","location":{"line":31,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/ComposerView.swift","character":1},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 562 lines"}},{"text":"#endif","violation":{"location":{"line":724,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/ComposerView.swift","character":1},"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 591","ruleName":"File Length"}},{"text":"","violation":{"ruleIdentifier":"file_name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/QuestionPickerCard.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name"}},{"violation":{"ruleDescription":"Type bodies should not span too many lines","severity":"warning","ruleIdentifier":"type_body_length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 683 lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/QuestionPickerCard.swift","line":17,"character":1},"ruleName":"Type Body Length"},"text":"struct QuestionPickerContent: View {"},{"violation":{"ruleName":"File Length","severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 690","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/QuestionPickerCard.swift","character":1,"line":819},"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines."},"text":"}"},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Machines\/MachineAppearanceViews.swift"},"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Machines\/MachineSheets.swift"},"ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Onboarding\/ComputerUsePermissionsSetupView.swift","line":1},"ruleIdentifier":"file_name","ruleName":"File Name","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 734 lines","location":{"character":1,"line":15,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Onboarding\/OnboardingView.swift"},"severity":"warning","ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","ruleName":"Type Body Length"},"text":"struct OnboardingView: View {"},{"violation":{"ruleDescription":"Files should not span too many lines.","ruleName":"File Length","location":{"line":984,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Onboarding\/OnboardingView.swift"},"severity":"warning","ruleIdentifier":"file_length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 768"},"text":"}"},{"violation":{"ruleDescription":"Type bodies should not span too many lines","location":{"line":13,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneGroupModel.swift","character":7},"reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 445 lines","severity":"warning","ruleName":"Type Body Length","ruleIdentifier":"type_body_length"},"text":"final class PaneGroupModel: Identifiable {"},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneGroupView.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","severity":"warning"},"text":""},{"violation":{"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 569 lines","ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","severity":"warning","location":{"line":20,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneGroupView.swift","character":1},"ruleName":"Type Body Length"},"text":"struct PaneGroupBar: View {"},{"violation":{"severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 711","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","location":{"line":1030,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneGroupView.swift","character":1},"ruleIdentifier":"file_length"},"text":"}"},{"violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneTabDrag.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"},"text":""},{"text":"","violation":{"severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/WorkspaceCommands.swift","line":1},"ruleName":"File Name","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/WorkspaceSplitDrag.swift"},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","severity":"warning"}},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","ruleName":"File Length","ruleIdentifier":"file_length","severity":"warning","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/WorkspaceSplitView.swift","line":618},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 512"}},{"text":"","violation":{"ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/AttachmentLightbox.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","severity":"warning"}},{"text":"","violation":{"severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/AttachmentViews.swift"}}},{"text":"struct ChatScreen: View {","violation":{"ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","severity":"warning","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/ChatScreen.swift","line":15},"ruleIdentifier":"type_body_length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 668 lines"}},{"text":"}","violation":{"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 862","ruleDescription":"Files should not span too many lines.","severity":"warning","ruleName":"File Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/ChatScreen.swift","line":985,"character":1},"ruleIdentifier":"file_length"}},{"text":"struct NewChatView: View {","violation":{"ruleName":"Type Body Length","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/NewChatView.swift","character":1,"line":25},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 475 lines","ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 556","ruleName":"File Length","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/NewChatView.swift","line":712},"severity":"warning"}},{"text":"struct SessionContainerView: View {","violation":{"reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 815 lines","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionContainerView.swift","character":1,"line":7},"severity":"error","ruleIdentifier":"type_body_length"}},{"text":"}","violation":{"severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 820","ruleDescription":"Files should not span too many lines.","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionContainerView.swift","line":1024,"character":1},"ruleName":"File Length","ruleIdentifier":"file_length"}},{"text":"final class SessionStore {","violation":{"ruleName":"Type Body Length","severity":"warning","ruleDescription":"Type bodies should not span too many lines","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 595 lines","ruleIdentifier":"type_body_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionStore.swift","character":7,"line":11}}},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionStore.swift","line":864},"ruleIdentifier":"file_length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 603","ruleName":"File Length","severity":"warning"}},{"text":"","violation":{"severity":"warning","ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionView.swift","line":1}}},{"text":"final class VirtualizedTranscriptScrollView: NSScrollView {","violation":{"reason":"Class body should span 800 lines or less excluding comments and whitespace: currently spans 1099 lines","ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines","severity":"error","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/VirtualizedTranscriptScrollView.swift","character":7,"line":12},"ruleName":"Type Body Length"}},{"text":"}","violation":{"ruleName":"File Length","severity":"error","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","location":{"character":1,"line":1387,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/VirtualizedTranscriptScrollView.swift"},"reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1107"}},{"text":"struct MachinesSettingsView: View {","violation":{"severity":"warning","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 457 lines","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/MachinesSettingsView.swift","line":19},"ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","ruleName":"Type Body Length"}},{"text":"struct McpSettingsView: View {","violation":{"ruleIdentifier":"type_body_length","ruleName":"Type Body Length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 485 lines","severity":"warning","ruleDescription":"Type bodies should not span too many lines","location":{"character":1,"line":7,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/McpSettingsView.swift"}}},{"text":"struct OpenCodeProviderAuthenticationView: View {","violation":{"ruleName":"Type Body Length","severity":"warning","location":{"line":6,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/OpenCodeProviderAuthenticationView.swift"},"ruleDescription":"Type bodies should not span too many lines","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 655 lines","ruleIdentifier":"type_body_length"}},{"text":"}","violation":{"severity":"warning","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","location":{"line":733,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/OpenCodeProviderAuthenticationView.swift"},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 661","ruleIdentifier":"file_length"}},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","ruleName":"File Length","location":{"line":848,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/SettingsView.swift"},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 707","severity":"warning","ruleIdentifier":"file_length"}},{"text":"","violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/SettingsWindowToolbarStyle.swift"},"ruleIdentifier":"file_name","ruleName":"File Name","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)"}},{"text":"struct SkillsSettingsView: View {","violation":{"ruleIdentifier":"type_body_length","ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","severity":"warning","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/SkillsSettingsView.swift","line":9},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 462 lines"}},{"text":"}","violation":{"severity":"warning","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","location":{"character":1,"line":771,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/SkillsSettingsView.swift"},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 709","ruleName":"File Length"}},{"violation":{"ruleName":"Type Body Length","reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 1144 lines","severity":"error","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Sidebar\/SidebarView.swift","line":16},"ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length"},"text":"struct SidebarView: View {"},{"violation":{"ruleIdentifier":"file_length","severity":"error","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Sidebar\/SidebarView.swift","character":1,"line":1412},"reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1163"},"text":"}"},{"violation":{"ruleIdentifier":"type_body_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Terminal\/CodevisorGhosttyApp.swift","line":20,"character":7},"ruleDescription":"Type bodies should not span too many lines","severity":"warning","ruleName":"Type Body Length","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 564 lines"},"text":"final class CodevisorGhosttyApp {"},{"violation":{"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 574","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","ruleIdentifier":"file_length","severity":"warning","location":{"line":792,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Terminal\/CodevisorGhosttyApp.swift"}},"text":"}"},{"violation":{"ruleIdentifier":"file_name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Terminal\/GhosttyTerminalSurfaceAdapter.swift"},"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleIdentifier":"file_name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Terminal\/TerminalFocus.swift"},"ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/ACPKit\/Sources\/ACPKit\/JSON\/JSONCoding.swift"}},"text":""},{"violation":{"ruleIdentifier":"file_name","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/ACPKit\/Sources\/ACPKit\/Protocol\/Session.swift"},"ruleDescription":"File name should match a type or extension declared in the file (if any)","reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/ACPKit\/Sources\/ACPKit\/Protocol\/SessionConfig.swift"}},"text":""},{"violation":{"severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/ACPKit\/Sources\/ACPKit\/Protocol\/SessionManagement.swift"},"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name"},"text":""},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/AppVariant.swift","line":1}},"text":""},{"violation":{"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/Logging.swift","line":1}},"text":""},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/ServerAgentService.swift"}}},{"text":"public struct ServerSessionTransport: Sendable {","violation":{"ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","severity":"warning","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 477 lines","ruleIdentifier":"type_body_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/ServerSessionTransport.swift","character":8,"line":160}}},{"text":"}","violation":{"ruleIdentifier":"file_length","location":{"line":715,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/ServerSessionTransport.swift"},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 590","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","severity":"warning"}},{"text":"","violation":{"ruleIdentifier":"file_name","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/SessionSetup.swift","line":1}}},{"text":"public actor CloudHubConnection {","violation":{"ruleName":"Type Body Length","severity":"warning","ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines","location":{"character":8,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Sources\/CodevisorCloud\/CloudHubConnection.swift","line":159},"reason":"Actor body should span 400 lines or less excluding comments and whitespace: currently spans 671 lines"}},{"text":"}","violation":{"ruleName":"File Length","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Sources\/CodevisorCloud\/CloudHubConnection.swift","character":1,"line":980},"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 816"}},{"text":"","violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Sources\/CodevisorCloud\/CloudRelayTransport.swift"},"ruleName":"File Name","ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)"}},{"text":"struct CloudHubConnectionTests {","violation":{"ruleDescription":"Type bodies should not span too many lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Tests\/CodevisorCloudTests\/CloudHubConnectionTests.swift","line":9,"character":1},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 507 lines","ruleName":"Type Body Length","severity":"warning","ruleIdentifier":"type_body_length"}},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","ruleName":"File Length","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Tests\/CodevisorCloudTests\/CloudHubConnectionTests.swift","line":592,"character":1},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 516"}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","reason":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Tests\/CodevisorCloudTests\/CloudRelayTestSupport.swift"},"severity":"warning","ruleIdentifier":"file_name","ruleName":"File Name"}},{"text":"public final class AppEnvironment {","violation":{"severity":"warning","ruleName":"Type Body Length","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 448 lines","ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/AppEnvironment.swift","character":14,"line":11}}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","severity":"warning","ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Notifications\/ChatAttention.swift","line":1}}},{"violation":{"ruleIdentifier":"file_name","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Panes\/SplitTree.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"location":{"character":14,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Persistence\/ClientDatabase.swift","line":43},"ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 563 lines","severity":"warning","ruleIdentifier":"type_body_length"},"text":"public final class ClientDatabase: @unchecked Sendable {"},{"violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Persistence\/ClientDatabase.swift","line":872,"character":1},"ruleName":"File Length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 783","severity":"warning","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines."},"text":"}"},{"violation":{"severity":"warning","location":{"line":20,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Persistence\/ClientStorageBootstrap.swift","character":8},"ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","reason":"Enum body should span 400 lines or less excluding comments and whitespace: currently spans 444 lines"},"text":"public enum ClientStorageBootstrap {"},{"violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Persistence\/Repositories.swift"},"reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/PreviewSupport.swift"},"ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning"},"text":""},{"violation":{"reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 769 lines","ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Server\/MachineController.swift","character":14,"line":101}},"text":"public final class MachineController {"},{"violation":{"ruleName":"File Length","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Server\/MachineController.swift","line":1108,"character":1},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 857"},"text":"}"},{"violation":{"ruleIdentifier":"type_body_length","ruleName":"Type Body Length","location":{"character":14,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/ViewModels\/ProjectListModel.swift","line":99},"ruleDescription":"Type bodies should not span too many lines","severity":"error","reason":"Class body should span 800 lines or less excluding comments and whitespace: currently spans 995 lines"},"text":"public final class ProjectListModel {"},{"violation":{"ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","severity":"error","location":{"line":1336,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/ViewModels\/ProjectListModel.swift","character":1},"ruleName":"File Length","reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1085"},"text":"}"},{"violation":{"ruleName":"Type Body Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/ViewModels\/WorkspaceSyncModel.swift","line":18,"character":14},"ruleDescription":"Type bodies should not span too many lines","severity":"error","reason":"Class body should span 800 lines or less excluding comments and whitespace: currently spans 1060 lines","ruleIdentifier":"type_body_length"},"text":"public final class WorkspaceSyncModel {"},{"violation":{"reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1071","ruleName":"File Length","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/ViewModels\/WorkspaceSyncModel.swift","line":1216},"severity":"error"},"text":"}"},{"violation":{"ruleName":"Type Body Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/MachineControllerTests.swift","character":1,"line":8},"reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 1124 lines","ruleIdentifier":"type_body_length","severity":"error","ruleDescription":"Type bodies should not span too many lines"},"text":"struct MachineControllerTests {"},{"violation":{"reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1532","severity":"error","ruleIdentifier":"file_length","ruleName":"File Length","ruleDescription":"Files should not span too many lines.","location":{"line":1702,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/MachineControllerTests.swift","character":1}},"text":"}"},{"violation":{"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 458 lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/PaneGroupStateTests.swift","character":1,"line":6},"ruleIdentifier":"type_body_length","severity":"warning","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length"},"text":"struct PaneGroupStateTests {"},{"violation":{"severity":"warning","ruleName":"Type Body Length","location":{"line":8,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/ProjectListModelTests.swift","character":1},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 749 lines","ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines"},"text":"struct ProjectListModelTests {"},{"violation":{"severity":"warning","location":{"line":1146,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/ProjectListModelTests.swift"},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 965","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","ruleName":"File Length"},"text":"}"},{"violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/WorkspaceTests.swift","line":1},"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name"},"text":""},{"violation":{"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 588","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/WorkspaceTests.swift","line":667},"ruleIdentifier":"file_length","ruleName":"File Length","ruleDescription":"Files should not span too many lines.","severity":"warning"},"text":"}"},{"violation":{"ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/AppEnvironmentLive.swift","line":1},"ruleIdentifier":"file_name"},"text":""},{"violation":{"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Permissions\/ComputerUsePermissions.swift"},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","severity":"warning"},"text":""},{"violation":{"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","location":{"line":281,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/ComputerUsePresentation.swift","character":7},"ruleDescription":"Type bodies should not span too many lines","severity":"warning","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 516 lines"},"text":"final class ComputerUsePresentationState: NSObject {"},{"violation":{"ruleIdentifier":"file_length","severity":"error","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/ComputerUsePresentation.swift","line":1433,"character":1},"reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1203","ruleName":"File Length","ruleDescription":"Files should not span too many lines."},"text":"}"},{"violation":{"ruleDescription":"Type bodies should not span too many lines","location":{"character":14,"line":26,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/LocalCodevisorServer.swift"},"ruleIdentifier":"type_body_length","ruleName":"Type Body Length","severity":"warning","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 605 lines"},"text":"public final class LocalCodevisorServer: LocalServerControlling {"},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","severity":"warning","location":{"line":777,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/LocalCodevisorServer.swift","character":1},"ruleName":"File Length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 629"}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","ruleIdentifier":"file_name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/TailscaleDiscovery.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"struct ComputerUseBridgeTests {","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/ComputerUseBridgeTests.swift","line":8,"character":1},"ruleDescription":"Type bodies should not span too many lines","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 533 lines","severity":"warning","ruleIdentifier":"type_body_length","ruleName":"Type Body Length"}},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","ruleName":"File Length","severity":"warning","location":{"line":615,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/ComputerUseBridgeTests.swift"},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 541","ruleIdentifier":"file_length"}},{"text":"struct LocalCodevisorServerTests {","violation":{"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 503 lines","ruleDescription":"Type bodies should not span too many lines","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/LocalCodevisorServerTests.swift","line":9,"character":1}}},{"text":"}","violation":{"severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 582","ruleDescription":"Files should not span too many lines.","location":{"line":661,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/LocalCodevisorServerTests.swift"},"ruleIdentifier":"file_length","ruleName":"File Length"}},{"text":"","violation":{"severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/Support\/EnvironmentFakes.swift"},"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name"}},{"text":"","violation":{"ruleName":"File Name","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/AttachmentBadges.swift"},"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"ruleIdentifier":"file_name","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/AttachmentPreviewSizing.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/DesignSystem\/ScaledMetrics.swift"},"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/DesignSystem\/ThemedSurface.swift"},"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning"}},{"text":"","violation":{"ruleIdentifier":"file_name","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/MarkdownThemeAdapter.swift","line":1}}},{"text":"","violation":{"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Navigation\/WorkspaceTabZoomTransition.swift"},"ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name","ruleIdentifier":"file_name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/PlatformShims.swift","line":1}}},{"text":"","violation":{"severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/ChatStatusRows.swift"},"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"}},{"text":"","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/NewChatPromotionLifecycle.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name","ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/TranscriptDisclosureViews.swift","line":1},"ruleIdentifier":"file_name"}},{"text":"","violation":{"ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/TranscriptSendAnimation.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name"}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","ruleIdentifier":"file_name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/TranscriptStreamingTextAnimation.swift"},"reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/TranscriptEnvironment.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleIdentifier":"file_name"}},{"text":"","violation":{"severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/MarkdownPortableChipText.swift"},"ruleIdentifier":"file_name","ruleName":"File Name"}},{"text":"","violation":{"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/MarkdownPortableViews.swift"},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning"}},{"text":"#endif","violation":{"severity":"warning","ruleIdentifier":"file_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/MarkdownTableView.swift","line":910,"character":1},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 712","ruleName":"File Length","ruleDescription":"Files should not span too many lines."}},{"text":"","violation":{"ruleIdentifier":"file_name","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/RenderCaches.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"}},{"violation":{"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/SelectableTextView.swift","line":963,"character":1},"ruleName":"File Length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 793","severity":"warning"},"text":"#endif"},{"violation":{"severity":"warning","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/StreamingTextAnimation.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/UIFontScaling.swift","line":1},"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/AssistantMarkdownAttachments.swift","line":1},"severity":"warning"},"text":""},{"violation":{"ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/ToolCallDiffTotals.swift","line":1},"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/ToolCallPresentation.swift","line":1}},"text":""},{"violation":{"ruleName":"File Name","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/TranscriptRowProjection.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/WorkedItems.swift"},"reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleIdentifier":"type_body_length","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Tests\/TranscriptKitTests\/TranscriptReducerTests.swift","line":7},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 447 lines","ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","severity":"warning"},"text":"struct TranscriptReducerTests {"},{"violation":{"ruleName":"File Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Tests\/TranscriptKitTests\/TranscriptReducerTests.swift","line":585,"character":1},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 514","ruleIdentifier":"file_length","severity":"warning","ruleDescription":"Files should not span too many lines."},"text":"}"}] \ No newline at end of file +[{"violation":{"severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Composer\/ComposerAttachments.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Composer\/ComposerBar.swift","line":17,"character":1},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 497 lines","ruleName":"Type Body Length","ruleIdentifier":"type_body_length","severity":"warning","ruleDescription":"Type bodies should not span too many lines"},"text":"struct ComposerBar: View {"},{"violation":{"severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Composer\/ComposerBar.swift","line":894,"character":1},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 670","ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","ruleName":"File Length"},"text":"}"},{"violation":{"reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 1445 lines","ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","severity":"error","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Home\/HomeView.swift","line":10,"character":1},"ruleName":"Type Body Length"},"text":"struct HomeView: View {"},{"violation":{"ruleName":"File Length","ruleDescription":"Files should not span too many lines.","reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1455","ruleIdentifier":"file_length","severity":"error","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Home\/HomeView.swift","line":1729,"character":1}},"text":"}"},{"violation":{"ruleName":"File Length","location":{"character":1,"line":651,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Onboarding\/OnboardingView.swift"},"ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 532"},"text":"}"},{"violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/AttachmentPreviews.swift"},"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name"},"text":""},{"violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/NewChatPresentation.swift"},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/SessionScreen.swift"},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning"},"text":""},{"violation":{"severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/SessionScreen.swift","line":16,"character":1},"ruleIdentifier":"type_body_length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 426 lines","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length"},"text":"struct SessionTranscriptView: View {"},{"violation":{"reason":"Class body should span 800 lines or less excluding comments and whitespace: currently spans 1363 lines","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","ruleIdentifier":"type_body_length","severity":"error","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/VirtualizedTranscriptScrollView.swift","line":11,"character":7}},"text":"final class VirtualizedTranscriptScrollView: UIScrollView, UIScrollViewDelegate {"},{"violation":{"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","severity":"error","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Session\/VirtualizedTranscriptScrollView.swift","line":1544},"reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1371"},"text":"}"},{"violation":{"severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Terminal\/TerminalScreen.swift"},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name"},"text":""},{"violation":{"ruleIdentifier":"type_body_length","severity":"error","ruleDescription":"Type bodies should not span too many lines","reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 1215 lines","location":{"line":13,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Workspace\/WorkspaceScreen.swift"},"ruleName":"Type Body Length"},"text":"struct WorkspaceScreen: View {"},{"violation":{"ruleDescription":"Files should not span too many lines.","ruleName":"File Length","severity":"error","ruleIdentifier":"file_length","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/ios\/Codevisor\/Features\/Workspace\/WorkspaceScreen.swift","line":1510},"reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1221"},"text":"}"},{"violation":{"severity":"warning","ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/ContentView.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"},"text":""},{"violation":{"ruleName":"File Length","ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","location":{"character":1,"line":735,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/ContentView.swift"},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 588","severity":"warning"},"text":"}"},{"violation":{"ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/DesignSystem\/HoverTracking.swift","line":1}},"text":""},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/DesignSystem\/ThemedRootModifier.swift"},"reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleName":"File Name","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/DesignSystem\/TitlebarSeparatorModifier.swift","line":1},"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/ComposerView.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"},"text":""},{"violation":{"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 562 lines","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","location":{"line":31,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/ComposerView.swift","character":1},"ruleIdentifier":"type_body_length","severity":"warning"},"text":"struct ComposerCard: View {"},{"violation":{"ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","location":{"line":724,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/ComposerView.swift"},"ruleName":"File Length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 591","severity":"warning"},"text":"#endif"},{"violation":{"severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/QuestionPickerCard.swift"},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"text":"struct QuestionPickerContent: View {","violation":{"ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/QuestionPickerCard.swift","line":17,"character":1},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 683 lines"}},{"text":"}","violation":{"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 690","ruleDescription":"Files should not span too many lines.","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Composer\/QuestionPickerCard.swift","line":819,"character":1},"ruleIdentifier":"file_length","ruleName":"File Length","severity":"warning"}},{"text":"","violation":{"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Machines\/MachineAppearanceViews.swift","line":1},"ruleName":"File Name"}},{"text":"","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Machines\/MachineSheets.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning"}},{"text":"","violation":{"severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Onboarding\/ComputerUsePermissionsSetupView.swift"},"reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"struct OnboardingView: View {","violation":{"ruleName":"Type Body Length","severity":"warning","ruleDescription":"Type bodies should not span too many lines","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Onboarding\/OnboardingView.swift","line":15},"ruleIdentifier":"type_body_length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 734 lines"}},{"text":"}","violation":{"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 768","ruleName":"File Length","location":{"line":984,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Onboarding\/OnboardingView.swift"}}},{"text":"final class PaneGroupModel: Identifiable {","violation":{"reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 445 lines","ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","location":{"line":13,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneGroupModel.swift","character":7},"severity":"warning"}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneGroupView.swift","line":1},"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning"}},{"text":"struct PaneGroupBar: View {","violation":{"severity":"warning","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 569 lines","ruleIdentifier":"type_body_length","ruleName":"Type Body Length","location":{"line":20,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneGroupView.swift"},"ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneGroupView.swift","character":1,"line":1030},"ruleIdentifier":"file_length","severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 711","ruleDescription":"Files should not span too many lines.","ruleName":"File Length"}},{"text":"","violation":{"ruleName":"File Name","ruleIdentifier":"file_name","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/PaneTabDrag.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)"}},{"violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/WorkspaceCommands.swift"},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/WorkspaceSplitDrag.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name"},"text":""},{"violation":{"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Panes\/WorkspaceSplitView.swift","character":1,"line":618},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 512"},"text":"}"},{"violation":{"reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/AttachmentLightbox.swift","line":1}},"text":""},{"violation":{"reason":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/AttachmentViews.swift"},"ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning"},"text":""},{"violation":{"location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/ChatScreen.swift","line":15},"ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 668 lines","severity":"warning","ruleIdentifier":"type_body_length"},"text":"struct ChatScreen: View {"},{"violation":{"ruleName":"File Length","ruleDescription":"Files should not span too many lines.","severity":"warning","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/ChatScreen.swift","line":985},"ruleIdentifier":"file_length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 862"},"text":"}"},{"violation":{"severity":"warning","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/NewChatView.swift","line":25},"ruleIdentifier":"type_body_length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 475 lines","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length"},"text":"struct NewChatView: View {"},{"violation":{"ruleDescription":"Files should not span too many lines.","severity":"warning","ruleIdentifier":"file_length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 556","ruleName":"File Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/NewChatView.swift","line":712,"character":1}},"text":"}"},{"violation":{"ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","severity":"error","reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 815 lines","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionContainerView.swift","line":7}},"text":"struct SessionContainerView: View {"},{"violation":{"severity":"warning","ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionContainerView.swift","character":1,"line":1024},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 820","ruleName":"File Length"},"text":"}"},{"violation":{"reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 595 lines","ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionStore.swift","line":11,"character":7},"severity":"warning","ruleIdentifier":"type_body_length"},"text":"final class SessionStore {"},{"text":"}","violation":{"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 603","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","severity":"warning","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionStore.swift","line":864}}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/SessionView.swift"}}},{"text":"final class VirtualizedTranscriptScrollView: NSScrollView {","violation":{"ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","reason":"Class body should span 800 lines or less excluding comments and whitespace: currently spans 1099 lines","severity":"error","location":{"character":7,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/VirtualizedTranscriptScrollView.swift","line":12}}},{"text":"}","violation":{"severity":"error","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Session\/VirtualizedTranscriptScrollView.swift","line":1387},"ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1107","ruleName":"File Length","ruleDescription":"Files should not span too many lines."}},{"text":"struct MachinesSettingsView: View {","violation":{"ruleDescription":"Type bodies should not span too many lines","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 457 lines","ruleIdentifier":"type_body_length","ruleName":"Type Body Length","severity":"warning","location":{"line":19,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/MachinesSettingsView.swift","character":1}}},{"text":"struct McpSettingsView: View {","violation":{"ruleIdentifier":"type_body_length","severity":"warning","ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/McpSettingsView.swift","line":7,"character":1},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 485 lines"}},{"text":"struct OpenCodeProviderAuthenticationView: View {","violation":{"location":{"line":6,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/OpenCodeProviderAuthenticationView.swift"},"ruleName":"Type Body Length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 655 lines","ruleIdentifier":"type_body_length","severity":"warning","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 661","severity":"warning","ruleName":"File Length","ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/OpenCodeProviderAuthenticationView.swift","line":733,"character":1}}},{"text":"}","violation":{"ruleIdentifier":"file_length","location":{"line":848,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/SettingsView.swift","character":1},"ruleDescription":"Files should not span too many lines.","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 707","ruleName":"File Length","severity":"warning"}},{"text":"","violation":{"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/SettingsWindowToolbarStyle.swift","line":1},"ruleName":"File Name"}},{"text":"struct SkillsSettingsView: View {","violation":{"severity":"warning","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/SkillsSettingsView.swift","line":9},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 462 lines","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","ruleIdentifier":"type_body_length"}},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","ruleName":"File Length","severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 709","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Settings\/SkillsSettingsView.swift","line":771}}},{"text":"struct SidebarView: View {","violation":{"ruleDescription":"Type bodies should not span too many lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Sidebar\/SidebarView.swift","character":1,"line":16},"severity":"error","reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 1144 lines","ruleIdentifier":"type_body_length","ruleName":"Type Body Length"}},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","location":{"line":1412,"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Sidebar\/SidebarView.swift"},"severity":"error","ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1163"}},{"text":"final class CodevisorGhosttyApp {","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Terminal\/CodevisorGhosttyApp.swift","character":7,"line":20},"ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 564 lines","severity":"warning","ruleName":"Type Body Length"}},{"text":"}","violation":{"ruleIdentifier":"file_length","ruleName":"File Length","severity":"warning","location":{"line":792,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Terminal\/CodevisorGhosttyApp.swift","character":1},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 574","ruleDescription":"Files should not span too many lines."}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Terminal\/GhosttyTerminalSurfaceAdapter.swift","line":1},"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/apps\/macos\/Codevisor\/Features\/Terminal\/TerminalFocus.swift","line":1},"severity":"warning","ruleIdentifier":"file_name","ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/ACPKit\/Sources\/ACPKit\/JSON\/JSONCoding.swift"},"severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/ACPKit\/Sources\/ACPKit\/Protocol\/Session.swift","line":1},"ruleName":"File Name"}},{"text":"","violation":{"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/ACPKit\/Sources\/ACPKit\/Protocol\/SessionConfig.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleIdentifier":"file_name"}},{"text":"","violation":{"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/ACPKit\/Sources\/ACPKit\/Protocol\/SessionManagement.swift"}}},{"text":"","violation":{"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/AppVariant.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning"}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/Logging.swift"},"ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning"}},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/ServerAgentService.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","severity":"warning"},"text":""},{"violation":{"ruleName":"Type Body Length","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/ServerSessionTransport.swift","character":8,"line":160},"ruleDescription":"Type bodies should not span too many lines","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 477 lines","ruleIdentifier":"type_body_length"},"text":"public struct ServerSessionTransport: Sendable {"},{"violation":{"severity":"warning","location":{"character":1,"line":715,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/ServerSessionTransport.swift"},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 590","ruleDescription":"Files should not span too many lines.","ruleName":"File Length","ruleIdentifier":"file_length"},"text":"}"},{"violation":{"severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorClient\/Sources\/CodevisorClient\/SessionSetup.swift"}},"text":""},{"violation":{"ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","location":{"line":159,"character":8,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Sources\/CodevisorCloud\/CloudHubConnection.swift"},"ruleIdentifier":"type_body_length","severity":"warning","reason":"Actor body should span 400 lines or less excluding comments and whitespace: currently spans 671 lines"},"text":"public actor CloudHubConnection {"},{"violation":{"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 816","ruleName":"File Length","ruleIdentifier":"file_length","location":{"line":980,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Sources\/CodevisorCloud\/CloudHubConnection.swift","character":1},"ruleDescription":"Files should not span too many lines.","severity":"warning"},"text":"}"},{"violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Sources\/CodevisorCloud\/CloudRelayTransport.swift","line":1},"severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name"},"text":""},{"violation":{"ruleDescription":"Type bodies should not span too many lines","location":{"line":9,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Tests\/CodevisorCloudTests\/CloudHubConnectionTests.swift","character":1},"ruleIdentifier":"type_body_length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 507 lines","severity":"warning","ruleName":"Type Body Length"},"text":"struct CloudHubConnectionTests {"},{"violation":{"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 516","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Tests\/CodevisorCloudTests\/CloudHubConnectionTests.swift","line":592,"character":1},"ruleName":"File Length"},"text":"}"},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCloud\/Tests\/CodevisorCloudTests\/CloudRelayTestSupport.swift"},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name"},"text":""},{"violation":{"ruleIdentifier":"type_body_length","severity":"warning","ruleName":"Type Body Length","location":{"character":14,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/AppEnvironment.swift","line":11},"reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 448 lines","ruleDescription":"Type bodies should not span too many lines"},"text":"public final class AppEnvironment {"},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Notifications\/ChatAttention.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"text":"","violation":{"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Panes\/SplitTree.swift","line":1}}},{"text":"public final class ClientDatabase: @unchecked Sendable {","violation":{"ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","ruleName":"Type Body Length","location":{"line":43,"character":14,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Persistence\/ClientDatabase.swift"},"reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 563 lines","severity":"warning"}},{"text":"}","violation":{"ruleDescription":"Files should not span too many lines.","ruleName":"File Length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 783","severity":"warning","ruleIdentifier":"file_length","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Persistence\/ClientDatabase.swift","line":872}}},{"text":"public enum ClientStorageBootstrap {","violation":{"severity":"warning","ruleName":"Type Body Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Persistence\/ClientStorageBootstrap.swift","line":20,"character":8},"ruleDescription":"Type bodies should not span too many lines","ruleIdentifier":"type_body_length","reason":"Enum body should span 400 lines or less excluding comments and whitespace: currently spans 444 lines"}},{"text":"","violation":{"severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Persistence\/Repositories.swift","line":1},"ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/PreviewSupport.swift"},"ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning"}},{"text":"public final class MachineController {","violation":{"ruleDescription":"Type bodies should not span too many lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Server\/MachineController.swift","line":101,"character":14},"ruleName":"Type Body Length","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 769 lines","severity":"warning","ruleIdentifier":"type_body_length"}},{"text":"}","violation":{"ruleIdentifier":"file_length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 857","ruleName":"File Length","severity":"warning","ruleDescription":"Files should not span too many lines.","location":{"line":1108,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/Server\/MachineController.swift","character":1}}},{"text":"public final class ProjectListModel {","violation":{"ruleName":"Type Body Length","location":{"line":99,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/ViewModels\/ProjectListModel.swift","character":14},"reason":"Class body should span 800 lines or less excluding comments and whitespace: currently spans 995 lines","ruleIdentifier":"type_body_length","severity":"error","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1085","ruleIdentifier":"file_length","ruleName":"File Length","ruleDescription":"Files should not span too many lines.","severity":"error","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/ViewModels\/ProjectListModel.swift","line":1336}}},{"text":"public final class WorkspaceSyncModel {","violation":{"ruleIdentifier":"type_body_length","severity":"error","ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","reason":"Class body should span 800 lines or less excluding comments and whitespace: currently spans 1060 lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/ViewModels\/WorkspaceSyncModel.swift","character":14,"line":18}}},{"text":"}","violation":{"ruleIdentifier":"file_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Sources\/CodevisorCore\/ViewModels\/WorkspaceSyncModel.swift","line":1216,"character":1},"ruleDescription":"Files should not span too many lines.","ruleName":"File Length","severity":"error","reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1071"}},{"text":"struct MachineControllerTests {","violation":{"ruleName":"Type Body Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/MachineControllerTests.swift","line":8,"character":1},"severity":"error","ruleDescription":"Type bodies should not span too many lines","reason":"Struct body should span 800 lines or less excluding comments and whitespace: currently spans 1124 lines","ruleIdentifier":"type_body_length"}},{"text":"}","violation":{"severity":"error","location":{"character":1,"line":1702,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/MachineControllerTests.swift"},"ruleName":"File Length","reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1532","ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines."}},{"text":"struct PaneGroupStateTests {","violation":{"ruleIdentifier":"type_body_length","ruleName":"Type Body Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/PaneGroupStateTests.swift","character":1,"line":6},"severity":"warning","ruleDescription":"Type bodies should not span too many lines","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 458 lines"}},{"text":"struct ProjectListModelTests {","violation":{"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 749 lines","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","ruleIdentifier":"type_body_length","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/ProjectListModelTests.swift","character":1,"line":8}}},{"text":"}","violation":{"ruleIdentifier":"file_length","severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 965","ruleName":"File Length","ruleDescription":"Files should not span too many lines.","location":{"line":1146,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/ProjectListModelTests.swift","character":1}}},{"text":"","violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/WorkspaceTests.swift"},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","severity":"warning"}},{"text":"}","violation":{"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 588","severity":"warning","ruleIdentifier":"file_length","ruleName":"File Length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCore\/Tests\/CodevisorCoreTests\/WorkspaceTests.swift","character":1,"line":667},"ruleDescription":"Files should not span too many lines."}},{"text":"","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/AppEnvironmentLive.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning"}},{"text":"","violation":{"severity":"warning","ruleName":"File Name","ruleIdentifier":"file_name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Permissions\/ComputerUsePermissions.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)"}},{"text":"final class ComputerUsePresentationState: NSObject {","violation":{"ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length","severity":"warning","location":{"line":281,"character":7,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/ComputerUsePresentation.swift"},"ruleIdentifier":"type_body_length","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 516 lines"}},{"text":"}","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/ComputerUsePresentation.swift","line":1433,"character":1},"severity":"error","ruleIdentifier":"file_length","ruleName":"File Length","reason":"File should contain 1000 lines or less excluding comments and whitespaces: currently contains 1203","ruleDescription":"Files should not span too many lines."}},{"text":"public final class LocalCodevisorServer: LocalServerControlling {","violation":{"ruleIdentifier":"type_body_length","ruleName":"Type Body Length","location":{"line":26,"character":14,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/LocalCodevisorServer.swift"},"severity":"warning","ruleDescription":"Type bodies should not span too many lines","reason":"Class body should span 400 lines or less excluding comments and whitespace: currently spans 605 lines"}},{"text":"}","violation":{"location":{"character":1,"line":777,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/LocalCodevisorServer.swift"},"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","severity":"warning","ruleName":"File Length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 629"}},{"text":"","violation":{"ruleIdentifier":"file_name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Sources\/CodevisorCoreMac\/Server\/TailscaleDiscovery.swift"},"severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"}},{"text":"struct ComputerUseBridgeTests {","violation":{"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 533 lines","ruleName":"Type Body Length","ruleDescription":"Type bodies should not span too many lines","severity":"warning","ruleIdentifier":"type_body_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/ComputerUseBridgeTests.swift","character":1,"line":8}}},{"text":"}","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/ComputerUseBridgeTests.swift","line":615,"character":1},"ruleIdentifier":"file_length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 541","ruleName":"File Length","severity":"warning","ruleDescription":"Files should not span too many lines."}},{"text":"struct LocalCodevisorServerTests {","violation":{"severity":"warning","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/LocalCodevisorServerTests.swift","line":9},"reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 503 lines","ruleIdentifier":"type_body_length","ruleDescription":"Type bodies should not span too many lines","ruleName":"Type Body Length"}},{"text":"}","violation":{"ruleName":"File Length","ruleDescription":"Files should not span too many lines.","location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/LocalCodevisorServerTests.swift","line":661},"severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 582","ruleIdentifier":"file_length"}},{"text":"","violation":{"location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorCoreMac\/Tests\/CodevisorCoreMacTests\/Support\/EnvironmentFakes.swift","line":1},"ruleDescription":"File name should match a type or extension declared in the file (if any)","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleName":"File Name","ruleIdentifier":"file_name"}},{"text":"","violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/AttachmentBadges.swift"},"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/AttachmentPreviewSizing.swift","line":1},"ruleIdentifier":"file_name"}},{"text":"","violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/DesignSystem\/ScaledMetrics.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/DesignSystem\/ThemedSurface.swift"},"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning"}},{"text":"","violation":{"ruleName":"File Name","severity":"warning","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/MarkdownThemeAdapter.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)"}},{"violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Navigation\/WorkspaceTabZoomTransition.swift"},"ruleName":"File Name","reason":"File name should match a type or extension declared in the file (if any)","severity":"warning","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"severity":"warning","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/PlatformShims.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"},"text":""},{"violation":{"severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/ChatStatusRows.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name"},"text":""},{"violation":{"severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/NewChatPromotionLifecycle.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/TranscriptDisclosureViews.swift"},"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/TranscriptSendAnimation.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning"},"text":""},{"violation":{"severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/Transcript\/TranscriptStreamingTextAnimation.swift"},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/CodevisorUI\/Sources\/CodevisorUI\/TranscriptEnvironment.swift"},"reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/MarkdownPortableChipText.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"severity":"warning","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/MarkdownPortableViews.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)"},"text":""},{"violation":{"severity":"warning","ruleIdentifier":"file_length","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/MarkdownTableView.swift","line":910,"character":1},"reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 712","ruleName":"File Length","ruleDescription":"Files should not span too many lines."},"text":"#endif"},{"violation":{"reason":"File name should match a type or extension declared in the file (if any)","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/RenderCaches.swift","line":1},"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning"},"text":""},{"text":"#endif","violation":{"location":{"character":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/SelectableTextView.swift","line":963},"ruleDescription":"Files should not span too many lines.","ruleIdentifier":"file_length","severity":"warning","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 793","ruleName":"File Length"}},{"text":"","violation":{"ruleIdentifier":"file_name","ruleName":"File Name","ruleDescription":"File name should match a type or extension declared in the file (if any)","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/StreamingTextAnimation.swift"},"reason":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","reason":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/StreamMarkdown\/Sources\/StreamMarkdown\/Views\/UIFontScaling.swift","line":1}}},{"text":"","violation":{"severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","ruleIdentifier":"file_name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/AssistantMarkdownAttachments.swift"}}},{"text":"","violation":{"severity":"warning","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/ToolCallDiffTotals.swift","line":1}}},{"text":"","violation":{"severity":"warning","ruleName":"File Name","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/ToolCallPresentation.swift","line":1},"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)"}},{"text":"","violation":{"severity":"warning","ruleIdentifier":"file_name","reason":"File name should match a type or extension declared in the file (if any)","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/TranscriptRowProjection.swift"}}},{"text":"","violation":{"reason":"File name should match a type or extension declared in the file (if any)","ruleIdentifier":"file_name","ruleDescription":"File name should match a type or extension declared in the file (if any)","ruleName":"File Name","severity":"warning","location":{"line":1,"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Sources\/TranscriptKit\/WorkedItems.swift"}}},{"text":"struct TranscriptReducerTests {","violation":{"ruleDescription":"Type bodies should not span too many lines","severity":"warning","ruleIdentifier":"type_body_length","ruleName":"Type Body Length","reason":"Struct body should span 400 lines or less excluding comments and whitespace: currently spans 447 lines","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Tests\/TranscriptKitTests\/TranscriptReducerTests.swift","character":1,"line":7}}},{"text":"}","violation":{"ruleName":"File Length","reason":"File should contain 500 lines or less excluding comments and whitespaces: currently contains 514","location":{"file":"file:\/\/\/Users\/dylanplayer\/codevisor\/ba818ef2-87b9-4f4e-9726-c11aa8d75efa\/peanut\/packages\/swift\/TranscriptKit\/Tests\/TranscriptKitTests\/TranscriptReducerTests.swift","character":1,"line":585},"ruleIdentifier":"file_length","ruleDescription":"Files should not span too many lines.","severity":"warning"}}] \ No newline at end of file diff --git a/apps/ios/Codevisor.xcodeproj/project.pbxproj b/apps/ios/Codevisor.xcodeproj/project.pbxproj index 64a2f046..eaa29112 100644 --- a/apps/ios/Codevisor.xcodeproj/project.pbxproj +++ b/apps/ios/Codevisor.xcodeproj/project.pbxproj @@ -275,7 +275,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODEVISOR_IOS_BUNDLE_IDENTIFIER = com.dylanplayer.codevisor.ios; + CODEVISOR_IOS_BUNDLE_IDENTIFIER = com.codevisor.ios; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; ENABLE_PREVIEWS = YES; @@ -324,7 +324,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 26.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.dylanplayer.codevisor.ios; + PRODUCT_BUNDLE_IDENTIFIER = com.codevisor.ios; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; STRING_CATALOG_GENERATE_SYMBOLS = YES; diff --git a/apps/ios/Codevisor/Diagnostics/IOSNavigationDiagnostics.swift b/apps/ios/Codevisor/Diagnostics/IOSNavigationDiagnostics.swift index b7c35330..73f66af9 100644 --- a/apps/ios/Codevisor/Diagnostics/IOSNavigationDiagnostics.swift +++ b/apps/ios/Codevisor/Diagnostics/IOSNavigationDiagnostics.swift @@ -43,7 +43,7 @@ struct IOSNavigationDiagnosticState: Equatable { enum IOSNavigationDiagnostics { #if DEBUG || NAVIGATION_DIAGNOSTICS private static let logger = Logger( - subsystem: "com.851labs.codevisor", + subsystem: "com.codevisor", category: "ios-navigation" ) private static var sequence: UInt64 = 0 diff --git a/apps/ios/Codevisor/Info.plist b/apps/ios/Codevisor/Info.plist index c1c04dde..dce0e89c 100644 --- a/apps/ios/Codevisor/Info.plist +++ b/apps/ios/Codevisor/Info.plist @@ -20,7 +20,7 @@ CFBundleURLName - com.dylanplayer.codevisor.ios + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleURLSchemes codevisor diff --git a/apps/macos/Codevisor.xcodeproj/project.pbxproj b/apps/macos/Codevisor.xcodeproj/project.pbxproj index be608268..0f0c66a9 100644 --- a/apps/macos/Codevisor.xcodeproj/project.pbxproj +++ b/apps/macos/Codevisor.xcodeproj/project.pbxproj @@ -302,7 +302,7 @@ ENABLE_USER_SELECTED_FILES = readonly; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = Info.plist; - CODEVISOR_DEV_BUNDLE_IDENTIFIER = com.851labs.Codevisor.Development; + CODEVISOR_DEV_BUNDLE_IDENTIFIER = com.codevisor.macos.dev; CODEVISOR_URL_SCHEME = "codevisor-dev"; CODEVISOR_DEV_DISPLAY_NAME = "Codevisor Dev"; CODEVISOR_DEV_PRODUCT_NAME = "Codevisor Dev"; @@ -454,8 +454,12 @@ "-framework", Combine, ); - // Keep the shipping identity stable so HerdMan installs update in place. - PRODUCT_BUNDLE_IDENTIFIER = com.851labs.HerdMan; + // Codevisor LLC identity. Sparkle carries existing installs across the + // rename from com.851labs.HerdMan: trust rides the EdDSA feed signature + // (SUPublicEDKey), and SUInstaller matches the update by app filename. + // First launch after the rename runs the legacy-identity migration + // (defaults domain, launch agent) in CodevisorClient/CodevisorCoreMac. + PRODUCT_BUNDLE_IDENTIFIER = com.codevisor.macos; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; SDKROOT = macosx; diff --git a/apps/macos/Codevisor/ContentView.swift b/apps/macos/Codevisor/ContentView.swift index 1d3acc99..70003e48 100644 --- a/apps/macos/Codevisor/ContentView.swift +++ b/apps/macos/Codevisor/ContentView.swift @@ -14,6 +14,10 @@ struct CodevisorApp: App { @State private var startupInProgress = false init() { + // Before anything reads defaults (Sparkle, window restoration): + // adopt the com.851labs.HerdMan domain left behind by pre-rename + // installs. One-time, marker-guarded. + LegacyDefaultsMigration.migrateIfNeeded() let serverAgent = MacServerAgentController() _environment = State(initialValue: nil) _serverAgent = State(initialValue: serverAgent) diff --git a/apps/macos/Codevisor/Features/Updates/MacServerAgentController.swift b/apps/macos/Codevisor/Features/Updates/MacServerAgentController.swift index fa1b8cf8..0ae13ffd 100644 --- a/apps/macos/Codevisor/Features/Updates/MacServerAgentController.swift +++ b/apps/macos/Codevisor/Features/Updates/MacServerAgentController.swift @@ -8,7 +8,13 @@ import ServiceManagement /// relocatable with the signed app bundle, and survives app/UI restarts. @MainActor final class MacServerAgentController { - static let plistName = "com.851labs.Codevisor.ServerAgent.plist" + static let plistName = "com.codevisor.macos.ServerAgent.plist" + /// The pre-team-migration agent (851labs identity). Its plist still ships + /// in the bundle solely so SMAppService can cleanly unregister the + /// registration left behind by pre-migration installs — unregistering + /// requires the service definition to exist. Remove the plist and this + /// path once the fleet has migrated. + static let legacyPlistName = "com.851labs.Codevisor.ServerAgent.plist" private let legacyJobs = LegacyServerJobRetirer() // Constructed on demand (it is cheap) so each detached closure below can @@ -17,6 +23,10 @@ final class MacServerAgentController { SMAppService.agent(plistName: plistName) } + private nonisolated static var legacyService: SMAppService { + SMAppService.agent(plistName: legacyPlistName) + } + var managedService: LocalCodevisorManagedService { LocalCodevisorManagedService( prepare: { [weak self] in try await self?.retireLegacyJobs() }, @@ -33,6 +43,13 @@ final class MacServerAgentController { // SMAppService.status/register/unregister are synchronous XPC round // trips to launchd/smd, so keep them off the main actor. try await Task.detached { + // A pre-migration install registered the agent under the 851labs + // plist; drop that registration before the renamed agent takes + // ownership, or launchd would bootstrap both at next login. + let legacy = Self.legacyService + if legacy.status == .enabled || legacy.status == .requiresApproval { + try? await legacy.unregister() + } let current = Self.service // This closure is reached only when no matching service is healthy. // Re-register an enabled-but-dead job so launchd resolves BundleProgram diff --git a/apps/macos/Codevisor/LaunchAgents/com.codevisor.macos.ServerAgent.plist b/apps/macos/Codevisor/LaunchAgents/com.codevisor.macos.ServerAgent.plist new file mode 100644 index 00000000..2bafcd72 --- /dev/null +++ b/apps/macos/Codevisor/LaunchAgents/com.codevisor.macos.ServerAgent.plist @@ -0,0 +1,18 @@ + + + + + Label + com.codevisor.macos.ServerAgent + BundleProgram + Contents/Resources/codevisor-server-agent + RunAtLoad + + KeepAlive + + ProcessType + Interactive + ThrottleInterval + 2 + + diff --git a/apps/macos/ERROR_HANDLING_AUDIT.md b/apps/macos/ERROR_HANDLING_AUDIT.md index b1f97b82..80ed6cf2 100644 --- a/apps/macos/ERROR_HANDLING_AUDIT.md +++ b/apps/macos/ERROR_HANDLING_AUDIT.md @@ -2,7 +2,7 @@ Audit date: 2026-07-11. Scope: `apps/macos/` excluding `Vendor/` (Ghostty) and tests. Raw counts: ~141 `try?` sites, ~57 bare `catch {` blocks. Only one `os.Logger` exists in -non-vendor code (`ScratchpadModel`, subsystem `com.851labs.codevisor`, category `scratchpad`). +non-vendor code (`ScratchpadModel`, subsystem `com.codevisor`, category `scratchpad`). Legend: **(a)** must surface a human-readable error to the user · **(b)** log-only is fine (best-effort/cosmetic) · **(c)** judgment call. @@ -110,7 +110,7 @@ Persistence and sync failures that lose state invisibly: import os public enum Log { - public static let subsystem = "com.851labs.codevisor" // matches ScratchpadModel's existing subsystem + public static let subsystem = "com.codevisor" // matches ScratchpadModel's existing subsystem public static let persistence = Logger(subsystem: subsystem, category: "persistence") public static let server = Logger(subsystem: subsystem, category: "server") public static let session = Logger(subsystem: subsystem, category: "session") @@ -124,8 +124,8 @@ public enum Log { ``` - Viewing: Console.app filtered on subsystem, or - `log show --predicate 'subsystem == "com.851labs.codevisor"' --last 1h --info --debug` - `log stream --predicate 'subsystem == "com.851labs.codevisor"' --level debug` + `log show --predicate 'subsystem == "com.codevisor"' --last 1h --info --debug` + `log stream --predicate 'subsystem == "com.codevisor"' --level debug` - Use `.error` for swallowed failures, `privacy: .public` on error descriptions so release builds aren't ``. - Optional "Export Logs" (Help menu) via `OSLogStore(scope: .currentProcessIdentifier)` → save to file for bug reports. - Small packages (ACPKit/StreamMarkdown/CodeHighlighter/CodevisorTheming) that shouldn't depend on CodevisorCore: give each a private `Logger` with the same subsystem string. diff --git a/apps/www/public/install.sh b/apps/www/public/install.sh index cf6a0a04..c75a6a1e 100644 --- a/apps/www/public/install.sh +++ b/apps/www/public/install.sh @@ -101,6 +101,9 @@ install_macos() { fi [ -d "$app_src" ] || fail "Codevisor.app not found in downloaded archive" + # Quit whichever identity is running: com.851labs.HerdMan predates the + # Codevisor, LLC migration. + osascript -e 'tell application id "com.codevisor.macos" to quit' >/dev/null 2>&1 || true osascript -e 'tell application id "com.851labs.HerdMan" to quit' >/dev/null 2>&1 || true [ ! -d "$app_dest" ] || { say "Replacing existing $app_dest"; rm -rf "$app_dest"; } [ ! -d "$legacy_app_dest" ] || { say "Removing former $legacy_app_dest"; rm -rf "$legacy_app_dest"; } diff --git a/docs/ios-app-plan.md b/docs/ios-app-plan.md index 5d2ac68f..24889d99 100644 --- a/docs/ios-app-plan.md +++ b/docs/ios-app-plan.md @@ -22,7 +22,7 @@ Guiding principles: platform blocks merge. Status note: scaffolding is already done — `apps/ios/Codevisor.xcodeproj` -(bundle id `com.dylanplayer.codevisor.ios`, temp until the Codevisor LLC +(bundle id `com.codevisor.ios` under the Codevisor LLC developer account exists), shared package linkage proven (ACPKit + CodevisorTheming), `bun run dev:ios` starts the Dev Remote server and boots the app in the simulator, and the Xcode MCP tooling loop (build/run/tap/logs) is @@ -183,7 +183,7 @@ Work items: - Machine picker affordance + settings entry point. 3. **Worktree dev-experience parity** (`scripts/dev-ios.mjs`) - Per-worktree display name `Codevisor (worktree)` and bundle id suffix - `com.dylanplayer.codevisor.ios.` so multiple worktree builds + `com.codevisor.ios.` so multiple worktree builds coexist on one simulator/device. - Generated worktree-colored app icon: port `createDevelopmentAppIcon()` to produce an iOS asset catalog icon (same hash→hue derivation, same diff --git a/packages/swift/ACPKit/Sources/ACPKit/Logging.swift b/packages/swift/ACPKit/Sources/ACPKit/Logging.swift index 9443dd5a..fe9860e5 100644 --- a/packages/swift/ACPKit/Sources/ACPKit/Logging.swift +++ b/packages/swift/ACPKit/Sources/ACPKit/Logging.swift @@ -4,4 +4,4 @@ import os /// it carries its own `Logger` under the app's shared subsystem. Interpolated /// error strings use `privacy: .public` so release-build diagnostics stay /// readable; never log message bodies or file contents. -let acpLog = Logger(subsystem: "com.851labs.codevisor", category: "acp") +let acpLog = Logger(subsystem: "com.codevisor", category: "acp") diff --git a/packages/swift/CodeHighlighter/Sources/CodeHighlighter/CodeHighlighter.swift b/packages/swift/CodeHighlighter/Sources/CodeHighlighter/CodeHighlighter.swift index a3edd4df..9560736f 100644 --- a/packages/swift/CodeHighlighter/Sources/CodeHighlighter/CodeHighlighter.swift +++ b/packages/swift/CodeHighlighter/Sources/CodeHighlighter/CodeHighlighter.swift @@ -5,7 +5,7 @@ import os /// Package-private logging handle: CodeHighlighter must not depend on /// CodevisorCore, so it carries its own `Logger` under the app's shared /// subsystem. -private let log = Logger(subsystem: "com.851labs.codevisor", category: "highlighting") +private let log = Logger(subsystem: "com.codevisor", category: "highlighting") /// Syntax highlighting via Shiki running inside JavaScriptCore. The bundled /// `highlighter.js` (generated by apps/macos/scripts/build-highlighter.mjs) diff --git a/packages/swift/CodevisorClient/Sources/CodevisorClient/AppVariant.swift b/packages/swift/CodevisorClient/Sources/CodevisorClient/AppVariant.swift index f57e0afb..44ab6dc9 100644 --- a/packages/swift/CodevisorClient/Sources/CodevisorClient/AppVariant.swift +++ b/packages/swift/CodevisorClient/Sources/CodevisorClient/AppVariant.swift @@ -203,8 +203,9 @@ public enum CodevisorAppVariant: Sendable { ) } - /// One-time rescue for the HerdMan → Codevisor rename: the app updates in - /// place (the bundle id stayed `com.851labs.HerdMan`) but the Application + /// One-time rescue for the HerdMan → Codevisor rename: the app updated in + /// place (the bundle id stayed `com.851labs.HerdMan` until the Codevisor, + /// LLC identity migration to `com.codevisor.macos`) but the Application /// Support folder name changed, orphaning every file-backed preference in /// the old folder. Copies legacy files that don't exist at the new /// location yet; never overwrites, and leaves the old folder as a backup. diff --git a/packages/swift/CodevisorClient/Sources/CodevisorClient/LegacyDefaultsMigration.swift b/packages/swift/CodevisorClient/Sources/CodevisorClient/LegacyDefaultsMigration.swift new file mode 100644 index 00000000..ebcd1af2 --- /dev/null +++ b/packages/swift/CodevisorClient/Sources/CodevisorClient/LegacyDefaultsMigration.swift @@ -0,0 +1,31 @@ +import Foundation + +/// One-time rescue for the 851labs → Codevisor, LLC identity migration: the +/// shipping bundle id changed (com.851labs.HerdMan → com.codevisor.macos), +/// which moves the UserDefaults domain out from under every existing install. +/// Copies each legacy key the new domain doesn't define yet — window frames, +/// Sparkle's SU* bookkeeping, and any stray preference — then never runs +/// again. File-backed data needs no rescue: Application Support is named +/// "Codevisor", not derived from the bundle id. +public enum LegacyDefaultsMigration { + public static let legacyDomain = "com.851labs.HerdMan" + public static let markerKey = "codevisor.legacyDefaultsMigrated" + + public static func migrateIfNeeded(defaults: UserDefaults = .standard) { + // Dev builds never shipped under the legacy identity. + guard !CodevisorAppVariant.isDevelopment else { return } + apply(legacy: defaults.persistentDomain(forName: legacyDomain) ?? [:], to: defaults) + } + + /// Marker-guarded merge, separated from the domain read so tests can + /// exercise it against a scratch suite. Existing keys always win: a value + /// the renamed app already wrote is newer than anything in the legacy + /// domain. + static func apply(legacy: [String: Any], to defaults: UserDefaults) { + guard !defaults.bool(forKey: markerKey) else { return } + for (key, value) in legacy where defaults.object(forKey: key) == nil { + defaults.set(value, forKey: key) + } + defaults.set(true, forKey: markerKey) + } +} diff --git a/packages/swift/CodevisorClient/Sources/CodevisorClient/Logging.swift b/packages/swift/CodevisorClient/Sources/CodevisorClient/Logging.swift index b394c8a8..c43bbd58 100644 --- a/packages/swift/CodevisorClient/Sources/CodevisorClient/Logging.swift +++ b/packages/swift/CodevisorClient/Sources/CodevisorClient/Logging.swift @@ -1,7 +1,7 @@ import os /// Centralized handles into the unified logging system (Console.app, -/// `log stream --predicate 'subsystem == "com.851labs.codevisor"'`). +/// `log stream --predicate 'subsystem == "com.codevisor"'`). /// /// Every error the app absorbs — even ones that are fine to swallow from the /// user's point of view — must leave a trace here so failures are diagnosable @@ -12,7 +12,7 @@ import os /// redaction turns release-build diagnostics into ``, which defeats /// the purpose. Never log message bodies, tokens, or file contents. public enum Log { - public static let subsystem = "com.851labs.codevisor" + public static let subsystem = "com.codevisor" public static let persistence = Logger(subsystem: subsystem, category: "persistence") public static let server = Logger(subsystem: subsystem, category: "server") diff --git a/packages/swift/CodevisorClient/Tests/CodevisorClientTests/LegacyDefaultsMigrationTests.swift b/packages/swift/CodevisorClient/Tests/CodevisorClientTests/LegacyDefaultsMigrationTests.swift new file mode 100644 index 00000000..c4028bba --- /dev/null +++ b/packages/swift/CodevisorClient/Tests/CodevisorClientTests/LegacyDefaultsMigrationTests.swift @@ -0,0 +1,38 @@ +import Foundation +import Testing + +@testable import CodevisorClient + +struct LegacyDefaultsMigrationTests { + private func scratchDefaults() -> UserDefaults { + let suite = "codevisor.tests.legacy-defaults.\(UUID().uuidString)" + let defaults = UserDefaults(suiteName: suite)! + defaults.removePersistentDomain(forName: suite) + return defaults + } + + @Test func copiesLegacyKeysAndSetsMarker() { + let defaults = scratchDefaults() + LegacyDefaultsMigration.apply( + legacy: ["SUEnableAutomaticChecks": true, "someKey": "legacy"], + to: defaults + ) + #expect(defaults.bool(forKey: "SUEnableAutomaticChecks") == true) + #expect(defaults.string(forKey: "someKey") == "legacy") + #expect(defaults.bool(forKey: LegacyDefaultsMigration.markerKey) == true) + } + + @Test func existingKeysWin() { + let defaults = scratchDefaults() + defaults.set("current", forKey: "someKey") + LegacyDefaultsMigration.apply(legacy: ["someKey": "legacy"], to: defaults) + #expect(defaults.string(forKey: "someKey") == "current") + } + + @Test func runsOnlyOnce() { + let defaults = scratchDefaults() + LegacyDefaultsMigration.apply(legacy: [:], to: defaults) + LegacyDefaultsMigration.apply(legacy: ["late": "value"], to: defaults) + #expect(defaults.object(forKey: "late") == nil) + } +} diff --git a/packages/swift/CodevisorCoreMac/Sources/CodevisorCoreMac/Server/LegacyServerJobRetirer.swift b/packages/swift/CodevisorCoreMac/Sources/CodevisorCoreMac/Server/LegacyServerJobRetirer.swift index 02924bf9..e038f56e 100644 --- a/packages/swift/CodevisorCoreMac/Sources/CodevisorCoreMac/Server/LegacyServerJobRetirer.swift +++ b/packages/swift/CodevisorCoreMac/Sources/CodevisorCoreMac/Server/LegacyServerJobRetirer.swift @@ -22,6 +22,11 @@ public struct LegacyServerJobRetirer: Sendable { "com.851labs.codevisor-recovery", "com.851labs.herdman-recovery", "com.851labs.HerdMan-recovery", + // Pre-team-migration SMAppService agent (851labs identity). Booted + // out here so the renamed com.codevisor.macos.ServerAgent can claim + // the port; its BTM registration is unregistered separately by + // MacServerAgentController using the legacy plist. + "com.851labs.Codevisor.ServerAgent", ] private let runner: any CommandRunner diff --git a/packages/swift/CodevisorTheming/Sources/CodevisorTheming/Logging.swift b/packages/swift/CodevisorTheming/Sources/CodevisorTheming/Logging.swift index 937f5f1c..0f33d728 100644 --- a/packages/swift/CodevisorTheming/Sources/CodevisorTheming/Logging.swift +++ b/packages/swift/CodevisorTheming/Sources/CodevisorTheming/Logging.swift @@ -4,4 +4,4 @@ import os /// CodevisorCore, so it carries its own `Logger` under the app's shared /// subsystem. Interpolated error strings use `privacy: .public` so /// release-build diagnostics stay readable; never log file contents. -let themingLog = Logger(subsystem: "com.851labs.codevisor", category: "theming") +let themingLog = Logger(subsystem: "com.codevisor", category: "theming") diff --git a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Parser/InlineMarkdown.swift b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Parser/InlineMarkdown.swift index f840d1bb..e75142f5 100644 --- a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Parser/InlineMarkdown.swift +++ b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Parser/InlineMarkdown.swift @@ -5,7 +5,7 @@ import os /// Package-private logging handle: StreamMarkdown must not depend on /// CodevisorCore, so it carries its own `Logger` under the app's shared /// subsystem. `.debug` only — this file is on the per-render hot path. -private let log = Logger(subsystem: "com.851labs.codevisor", category: "markdown") +private let log = Logger(subsystem: "com.codevisor", category: "markdown") /// Renders inline markdown spans (emphasis, code, links) to `AttributedString`. /// diff --git a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/InlineCodeChipAttribute.swift b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/InlineCodeChipAttribute.swift index 5ce0f765..d8a971d9 100644 --- a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/InlineCodeChipAttribute.swift +++ b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/InlineCodeChipAttribute.swift @@ -6,5 +6,5 @@ import Foundation /// the TextKit layout manager paints behind the selectable glyphs. enum InlineCodeChipAttribute: AttributedStringKey { typealias Value = Bool - static let name = "com.851labs.codevisor.inlineCodeChip" + static let name = "com.codevisor.inlineCodeChip" } diff --git a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/SelectableTextView+UIKit.swift b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/SelectableTextView+UIKit.swift index 11e15178..1685fea3 100644 --- a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/SelectableTextView+UIKit.swift +++ b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/SelectableTextView+UIKit.swift @@ -157,7 +157,7 @@ extension NSAttributedString.Key { static let streamMarkdownRoundedBackground = NSAttributedString.Key( - "com.851labs.codevisor.streamMarkdownRoundedBackground" + "com.codevisor.streamMarkdownRoundedBackground" ) } diff --git a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/SelectableTextView.swift b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/SelectableTextView.swift index 0adab117..99043df6 100644 --- a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/SelectableTextView.swift +++ b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/SelectableTextView.swift @@ -198,7 +198,7 @@ extension NSAttributedString.Key { static let streamMarkdownRoundedBackground = NSAttributedString.Key( - "com.851labs.codevisor.streamMarkdownRoundedBackground" + "com.codevisor.streamMarkdownRoundedBackground" ) } diff --git a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/StreamingTextAnimation.swift b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/StreamingTextAnimation.swift index 9a866592..347918b6 100644 --- a/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/StreamingTextAnimation.swift +++ b/packages/swift/StreamMarkdown/Sources/StreamMarkdown/Views/StreamingTextAnimation.swift @@ -204,7 +204,7 @@ final class StreamingTextFadeMetadata: NSObject, NSCopying { extension NSAttributedString.Key { static let streamMarkdownFade = NSAttributedString.Key( - "com.851labs.codevisor.streamMarkdownFade" + "com.codevisor.streamMarkdownFade" ) } diff --git a/scripts/dev-ios.mjs b/scripts/dev-ios.mjs index cecaad68..1b778113 100644 --- a/scripts/dev-ios.mjs +++ b/scripts/dev-ios.mjs @@ -28,7 +28,7 @@ const developmentIconColor = colorFromHash(worktreeHash) const appDisplayName = `Codevisor (${worktreeName})` // Per-worktree bundle id so several worktrees' dev builds coexist on one // simulator/device, mirroring the macOS dev instance identifiers. -const bundleIdentifier = `com.dylanplayer.codevisor.ios.${instanceHash}` +const bundleIdentifier = `com.codevisor.ios.${instanceHash}` const simulatorName = process.env.CODEVISOR_IOS_SIMULATOR ?? "iPhone 17 Pro" const preferredPort = 51_000 + (Number.parseInt(instanceHash.slice(0, 8), 16) % 10_000) diff --git a/scripts/dev.mjs b/scripts/dev.mjs index 0c57669e..b2d18ac0 100644 --- a/scripts/dev.mjs +++ b/scripts/dev.mjs @@ -203,7 +203,7 @@ try { derivedDataPath, `CODEVISOR_DEV_PRODUCT_NAME=${appName}`, `CODEVISOR_DEV_DISPLAY_NAME=${appName}`, - `CODEVISOR_DEV_BUNDLE_IDENTIFIER=com.851labs.Codevisor.Development.${instanceHash}`, + `CODEVISOR_DEV_BUNDLE_IDENTIFIER=com.codevisor.macos.dev.${instanceHash}`, "ASSETCATALOG_COMPILER_APPICON_NAME=AppIconDevGenerated", "INFOPLIST_KEY_CFBundleIconFile=AppIconDevGenerated", "INFOPLIST_KEY_CFBundleIconName=AppIconDevGenerated", diff --git a/scripts/release/build-macos-app.sh b/scripts/release/build-macos-app.sh index 3962b8fb..9712e0af 100755 --- a/scripts/release/build-macos-app.sh +++ b/scripts/release/build-macos-app.sh @@ -239,14 +239,20 @@ for target in darwin-arm64 darwin-x64; do done agent_source="$repo_root/apps/macos/Codevisor/Resources/codevisor-server-agent" agent_destination="$app_path/Contents/Resources/codevisor-server-agent" -launch_agent_source="$repo_root/apps/macos/Codevisor/LaunchAgents/com.851labs.Codevisor.ServerAgent.plist" -launch_agent_destination="$app_path/Contents/Library/LaunchAgents/com.851labs.Codevisor.ServerAgent.plist" -mkdir -p "$(dirname "$launch_agent_destination")" +launch_agents_dir="$app_path/Contents/Library/LaunchAgents" +mkdir -p "$launch_agents_dir" cp "$agent_source" "$agent_destination" -cp "$launch_agent_source" "$launch_agent_destination" -# The synchronized Xcode group also sees the source plist as a resource. -# SMAppService requires it only in Contents/Library/LaunchAgents. -rm -f "$app_path/Contents/Resources/$(basename "$launch_agent_source")" +# Current agent plus the pre-team-migration (851labs) plist: SMAppService can +# only unregister the legacy registration while its definition still ships. +for launch_agent_plist in \ + "com.codevisor.macos.ServerAgent.plist" \ + "com.851labs.Codevisor.ServerAgent.plist"; do + cp "$repo_root/apps/macos/Codevisor/LaunchAgents/$launch_agent_plist" \ + "$launch_agents_dir/$launch_agent_plist" + # The synchronized Xcode group also sees the source plist as a resource. + # SMAppService requires it only in Contents/Library/LaunchAgents. + rm -f "$app_path/Contents/Resources/$launch_agent_plist" +done chmod +x "$agent_destination" find "$app_path" -name "._*" -delete diff --git a/scripts/release/update-homebrew-tap.mjs b/scripts/release/update-homebrew-tap.mjs index 7a3654da..3b616e8e 100755 --- a/scripts/release/update-homebrew-tap.mjs +++ b/scripts/release/update-homebrew-tap.mjs @@ -90,22 +90,29 @@ writeFileSync( # both would collide in \$HOMEBREW_PREFIX/bin. conflicts_with formula: "851-labs/tap/codevisor-server" - # Quit a running app before the bundle is swapped. The preflight covers - # upgrades from cask versions that predate the uninstall stanza; the guard - # keeps AppleScript from launching the app on a fresh install. + # Quit a running app before the bundle is swapped. Both identities: the + # 851labs bundle id covers installs that predate the Codevisor, LLC + # migration. The preflight covers upgrades from cask versions that predate + # the uninstall stanza; the guard keeps AppleScript from launching the app + # on a fresh install. preflight do - system_command "/usr/bin/osascript", - args: [ - "-e", - 'if application id "com.851labs.HerdMan" is running then ' \\ - 'tell application id "com.851labs.HerdMan" to quit' - ], - must_succeed: false + ["com.codevisor.macos", "com.851labs.HerdMan"].each do |bundle_id| + system_command "/usr/bin/osascript", + args: [ + "-e", + "if application id \\"#{bundle_id}\\" is running then " \\ + "tell application id \\"#{bundle_id}\\" to quit" + ], + must_succeed: false + end system_command "/bin/rm", args: ["-rf", "#{appdir}/HerdMan.app"] end - uninstall quit: "com.851labs.HerdMan" + uninstall quit: [ + "com.codevisor.macos", + "com.851labs.HerdMan", + ] # Relaunch after install/upgrade so \`brew upgrade\` hands back a running, # current app (which in turn restarts an outdated local server on launch).