Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
336 commits
Select commit Hold shift + click to select a range
f5122c6
Add ActiveCursorState Core abstraction and EditorCursorPosition value…
matthijseikelenboom Jul 8, 2026
e14f52d
Add AppActiveCursorState adapter bridging EditorManager to ActiveCurs…
matthijseikelenboom Jul 8, 2026
363a4d2
Inject activeCursorState into the workspace subtree via env key
matthijseikelenboom Jul 8, 2026
81ef05b
Rewrite StatusBarCursorPositionLabel onto the ActiveCursorState abstr…
matthijseikelenboom Jul 8, 2026
d5bd27c
Add FileEditorOverrides Core seam and FileEditorOverrideValues
matthijseikelenboom Jul 8, 2026
37292a1
Add AppFileEditorOverrides adapter bridging EditorManager document ov…
matthijseikelenboom Jul 8, 2026
734923d
Inject fileEditorOverrides into the inspector subtree via env key
matthijseikelenboom Jul 8, 2026
84427c1
Route File Inspector per-file overrides through the FileEditorOverrid…
matthijseikelenboom Jul 8, 2026
f35da29
Add FileRelocator Core command and Factory key
matthijseikelenboom Jul 8, 2026
2b618f0
Add AppFileRelocator adapter backed by MoveFileUseCase and register it
matthijseikelenboom Jul 8, 2026
8b0b75a
Route File Inspector rename/relocate through FileRelocator and drop E…
matthijseikelenboom Jul 8, 2026
52ad052
Refactor: Lift text-editing command registration out of settings decode
matthijseikelenboom Jul 8, 2026
cfbf911
Refactor: Lift keybinding default-seeding into an app-startup reconcile
matthijseikelenboom Jul 8, 2026
c4b5bce
Refactor: Move settings search keys and propertiesOf to app-side exte…
matthijseikelenboom Jul 8, 2026
28fc0a4
Chore: Scaffold and wire empty CodeEditSettings Foundation package
matthijseikelenboom Jul 8, 2026
90ba3e3
Refactor: Move settings leaf value types into CodeEditSettings package
matthijseikelenboom Jul 9, 2026
1ad0ebb
Refactor: Move settings data model and store into CodeEditSettings pa…
matthijseikelenboom Jul 9, 2026
722cc60
Test: Import CodeEditSettings in TaskManagerTests after settings extr…
matthijseikelenboom Jul 9, 2026
076a326
Feat: Add FindReplaceQuery primitive to CodeEditCore
matthijseikelenboom Jul 9, 2026
99fe92f
Feat: Bridge SearchState to the shared FindReplaceQuery primitive
matthijseikelenboom Jul 9, 2026
0f88699
Fix: Wait for indexing to settle in FindReplaceQueryBridgeTests setUp
matthijseikelenboom Jul 9, 2026
9a4cf3f
Refactor: Sever Editor's import of Search via the shared FindReplaceQ…
matthijseikelenboom Jul 9, 2026
08664a6
Feat: Add reveal(file:) to WorkspaceNavigator protocol
matthijseikelenboom Jul 9, 2026
feaa0a9
Refactor: Sever Editor's WorkspaceNotificationModel dependency via Wo…
matthijseikelenboom Jul 9, 2026
832e7c0
Refactor: Promote StatusBarView.height to CodeEditUI.LayoutMetrics.st…
matthijseikelenboom Jul 9, 2026
4b2351d
Refactor: Move StatusBar file-info computation into StatusBarFileInfo…
matthijseikelenboom Jul 9, 2026
355774e
Fix: Use @State instead of @EnvironmentObject mutation to break re-re…
matthijseikelenboom Jul 9, 2026
4b66d34
Chore: Remove unused fileSize and dimensions from StatusBarViewModel
matthijseikelenboom Jul 9, 2026
8926ae6
Refactor: Sever NavigatorArea's Editor dependency via WorkspaceNaviga…
matthijseikelenboom Jul 9, 2026
11b17dd
Refactor: Decouple OpenQuickly from Editor via environment-based file…
matthijseikelenboom Jul 9, 2026
26a347f
Feat: Add LanguageServicesProvider protocol to CodeEditDocument
matthijseikelenboom Jul 9, 2026
530cef8
Refactor: Decouple Editor from LSPService via LanguageServicesProvider
matthijseikelenboom Jul 9, 2026
c2c1309
Refactor: Move WorkspaceStatePersisting and WorkspaceStateKey to Code…
matthijseikelenboom Jul 10, 2026
2e15148
Refactor: Decouple CodeFileView from ThemeModel via environment-injec…
matthijseikelenboom Jul 10, 2026
2ade4bf
Refactor: Move generic SplitView widgets to CodeEditUI package
matthijseikelenboom Jul 10, 2026
36d9135
Refactor: Extract Editor feature into dedicated Swift package
matthijseikelenboom Jul 10, 2026
bdc5e91
Fix: Move languageServicesProvider Factory registration to CodeEditDo…
matthijseikelenboom Jul 10, 2026
9855240
Refactor: Introduce AppDependencies composition root bridging Contain…
matthijseikelenboom Jul 10, 2026
5b13a22
Refactor: Constructor-inject the workspace construction trunk from Ap…
matthijseikelenboom Jul 10, 2026
3aeddc4
Refactor: Constructor-inject Search package; drop its Factory dependency
matthijseikelenboom Jul 10, 2026
860c336
Refactor: Constructor-inject Notifications and all notificationManage…
matthijseikelenboom Jul 10, 2026
6099f15
Refactor: Static delegate provider and env keys for Document/Editor; …
matthijseikelenboom Jul 10, 2026
cc1624e
Refactor: Constructor-inject LSP registry package managers and shell …
matthijseikelenboom Jul 10, 2026
4a0b82d
Refactor: Env keys and init params for remaining app-side Factory con…
matthijseikelenboom Jul 10, 2026
438685c
Refactor: Delete Factory container; AppDependencies constructs the fu…
matthijseikelenboom Jul 10, 2026
884b36b
Refactor: Rename Search feature package to CESearch
matthijseikelenboom Jul 12, 2026
06f9266
Refactor: Rename Notifications feature package to CENotifications
matthijseikelenboom Jul 12, 2026
54fe514
Refactor: Rename Editor feature package to CEEditor
matthijseikelenboom Jul 12, 2026
7c1d36a
Refactor: Seam CEEditor behind WorkspaceFileProviding; move observer …
matthijseikelenboom Jul 12, 2026
e8c6473
Refactor: Split CodeEditServices umbrella into per-service products
matthijseikelenboom Jul 12, 2026
a7e537d
Refactor: Retype LSPService.workspaceFinder to return the workspace r…
matthijseikelenboom Jul 12, 2026
bccb43e
Fix: Give LSP integration tests an isolated AppDependencies graph (NS…
matthijseikelenboom Jul 12, 2026
9c1a48e
Refactor: Delete LSPService's dead install-notification path and its …
matthijseikelenboom Jul 12, 2026
ecd5f6b
Refactor: Route RegistryManager error notifications through the Error…
matthijseikelenboom Jul 12, 2026
2bbdba3
Refactor: Move LSP-support extensions from Utils into the LSP feature
matthijseikelenboom Jul 12, 2026
e67f35d
Refactor: Scaffold CELSP feature package with LSPUtil seed
matthijseikelenboom Jul 12, 2026
95f106a
Refactor: Move the LSP feature into the CELSP package
matthijseikelenboom Jul 12, 2026
bc31bd0
Refactor: Source workspace context from SourceControlManager in sourc…
matthijseikelenboom Jul 12, 2026
261a9ce
Refactor: Scaffold CESourceControl feature package
matthijseikelenboom Jul 12, 2026
7f5323e
Refactor: Move the SourceControl feature into the CESourceControl pac…
matthijseikelenboom Jul 12, 2026
199ddb4
Refactor: Decouple TaskManager from CEWorkspaceSettings via TasksConf…
matthijseikelenboom Jul 13, 2026
23e9657
Refactor: Scaffold CETerminal feature package
matthijseikelenboom Jul 13, 2026
97d2a72
Refactor: Move TerminalEmulator and Tasks into the CETerminal package
matthijseikelenboom Jul 13, 2026
e295822
Refactor: Depend on WorkspaceWindowManaging instead of the concrete m…
matthijseikelenboom Jul 13, 2026
c45fc45
Refactor: Depend on LSPServiceProtocol in command consumers
matthijseikelenboom Jul 13, 2026
2b18557
Refactor: Construct Workspace complete via WorkspaceFactory.make
matthijseikelenboom Jul 13, 2026
2222fd9
Refactor: Move window-UI models from Workspace to CodeEditWindowContr…
matthijseikelenboom Jul 13, 2026
94c8a1b
Refactor: Move ToolbarBranchPicker into CESourceControl
matthijseikelenboom Jul 13, 2026
d01bda6
Refactor: Promote KeyValueTable, actionBar, and SearchPanelView to th…
matthijseikelenboom Jul 13, 2026
e245688
Refactor: Dissolve the app-side CodeEditUI folder
matthijseikelenboom Jul 13, 2026
dd67b13
Refactor: Drop Workspace's vestigial NotificationCenter deinit
matthijseikelenboom Jul 13, 2026
dc5dfeb
Refactor: Split RegistryViewState out of RegistryManager
matthijseikelenboom Jul 13, 2026
98716dd
Refactor: Split LanguageServerListState out of LSPService
matthijseikelenboom Jul 13, 2026
39e2d20
Fix: Restore workspace-reopen-on-launch and file recents
matthijseikelenboom Jul 13, 2026
6abef3a
Refactor: Load the language-server registry lazily on first use
matthijseikelenboom Jul 13, 2026
fd08a0d
Refactor: Move the fuzzy-search algorithm into CodeEditCore
matthijseikelenboom Jul 14, 2026
81f3509
Refactor: Promote QuickSearchResultLabel to the CodeEditUI package
matthijseikelenboom Jul 14, 2026
111dfa7
Refactor: Fold the workspace window shell into Features/Workspace
matthijseikelenboom Jul 14, 2026
e053c84
Refactor: Rename DocumentsUnitTests to WorkspaceWindowTests
matthijseikelenboom Jul 14, 2026
4d6dcfa
Refactor: Move SoftwareUpdater to the app-shell root
matthijseikelenboom Jul 14, 2026
21fba34
Refactor: Delete dead Utils extensions and their orphaned tests
matthijseikelenboom Jul 14, 2026
5ae5ff2
Refactor: Promote URL helpers to CodeEditCore and CECircularProgressV…
matthijseikelenboom Jul 14, 2026
1c6e53a
Refactor: Own a single SoftwareUpdater in AppDependencies
matthijseikelenboom Jul 14, 2026
1c16caf
Refactor: Rename app UseCases to doer-style role nouns
matthijseikelenboom Jul 14, 2026
bc86ce1
Refactor: Rename package UseCases to doer-style role nouns
matthijseikelenboom Jul 14, 2026
bf2df63
Refactor: Fold CEWorkspace into Workspace and restructure by purpose
matthijseikelenboom Jul 14, 2026
6fb8266
Refactor: Rationalize feature folders to purpose-first grouping
matthijseikelenboom Jul 14, 2026
139cf9e
Style: Apply SwiftLint autocorrect fixes
matthijseikelenboom Jul 14, 2026
d1c8211
Style: Resolve all mechanical SwiftLint violations
matthijseikelenboom Jul 14, 2026
438869f
Docs: Document the public API of all local packages
matthijseikelenboom Jul 14, 2026
81687a3
Docs: Add contributor architecture guide with placement decision tree
matthijseikelenboom Jul 15, 2026
a864c82
CI: Enforce package tier charters via import audit and SwiftLint rules
matthijseikelenboom Jul 15, 2026
4eca689
Fix: Resolve main-thread hang when opening the Output utility area
matthijseikelenboom Jul 15, 2026
63018e1
Refactor: Move fuzzy-search algorithm into CodeEditCore
matthijseikelenboom Jul 15, 2026
38171ac
Refactor: Dissolve Features/Search into Utils/FuzzySearch
matthijseikelenboom Jul 15, 2026
a3266af
Refactor: Group app-shell files under App/
matthijseikelenboom Jul 15, 2026
4dc8cb4
Refactor: Group workspace-window features under WorkspaceWindow/
matthijseikelenboom Jul 15, 2026
fe8c0b1
Refactor: Group auxiliary windows under Windows/ and subgroup Settings
matthijseikelenboom Jul 15, 2026
89065d7
Tests: Add CodeEditCore test target and move Core-pure tests
matthijseikelenboom Jul 15, 2026
be55cca
Tests: Add CESearch test target and move FindReplaceQueryTests
matthijseikelenboom Jul 15, 2026
59c5a71
Tests: Pilot CodeEditUI package test target; delete dead snapshot suite
matthijseikelenboom Jul 15, 2026
58ffd5f
Tests: Clean stale skips from CodeEditTestPlan
matthijseikelenboom Jul 15, 2026
8dfd4fd
Tests: Move Indexer tests into CESearchTests
matthijseikelenboom Jul 15, 2026
da66387
Tests: Add CELSP test target with the SemanticTokens tests
matthijseikelenboom Jul 15, 2026
95195a6
Tests: Add CESourceControl test target with the pure SCM tests
matthijseikelenboom Jul 15, 2026
f4cfa20
Refactor: Move project-search model types into CESearch
matthijseikelenboom Jul 25, 2026
7ff33b2
Refactor: Rename FuzzySearch* symbols to FuzzyMatch*
matthijseikelenboom Jul 25, 2026
ba6aff2
Style: Put @Test attributes on their own lines
matthijseikelenboom Jul 25, 2026
68e290a
Refactor: Rename fuzzy-matching files and folders to match
matthijseikelenboom Jul 25, 2026
f13c77b
Refactor: Move the registry install cluster into CELSP
matthijseikelenboom Jul 26, 2026
a567622
Refactor: Move GitBranchesGroup into CESourceControl
matthijseikelenboom Jul 26, 2026
821a267
Docs: Sharpen the Core admission rule and add a glossary
matthijseikelenboom Jul 26, 2026
4fd5a6b
Fix: Remove unnecessary nonisolated(unsafe) annotations in CodeEditSe…
matthijseikelenboom Jul 26, 2026
c298e8e
Fix: Clear strict-concurrency warnings in CodeEditCore and CodeEditUI
matthijseikelenboom Jul 26, 2026
a8c2805
Fix: Isolate applyAppearance to the main actor
matthijseikelenboom Jul 26, 2026
508a02a
Fix: Express CodeFileDocument's static and autosave isolation
matthijseikelenboom Jul 26, 2026
f93873e
Refactor: Move workspace lifecycle doers to App scope
matthijseikelenboom Jul 31, 2026
d67b1cb
Refactor: Dissolve WorkspaceWindow/Window into the group root
matthijseikelenboom Jul 31, 2026
c685e3a
Refactor: Drop redundant prefix from workspace Settings group
matthijseikelenboom Jul 31, 2026
b61e3c8
Refactor: Rename Windows group to AuxiliaryWindows
matthijseikelenboom Jul 31, 2026
31cb0cb
Fix: Build CI via the workspace, not the bare project
matthijseikelenboom Jul 31, 2026
bbfa435
Fix: Bundle the authoritative Package.resolved for Acknowledgements
matthijseikelenboom Jul 31, 2026
abfcef8
Refactor: Untrack per-package resolved files
matthijseikelenboom Jul 31, 2026
7e6eef5
Fix: Target the right file when renaming from the navigator menu
matthijseikelenboom Jul 31, 2026
27d33d4
Refactor: Replace the workspace notification model with a reveal signal
matthijseikelenboom Jul 31, 2026
2b0a395
Refactor: Remove unused navigator table cell
matthijseikelenboom Jul 31, 2026
e87c36f
Refactor: Fold navigator cells into ProjectNavigator
matthijseikelenboom Jul 31, 2026
9a965a0
Refactor: Split CodeEditWindowController extensions by concern
matthijseikelenboom Jul 31, 2026
3b3b85e
Refactor: Flatten vestigial navigator and status bar files
matthijseikelenboom Jul 31, 2026
4d8a15c
Test: Assert reveal requests are sent, not stored
matthijseikelenboom Jul 31, 2026
8ce1e46
Refactor: Inject Workspace as an environment value
matthijseikelenboom Aug 2, 2026
088445c
Refactor: Drop redundant Workspace injections
matthijseikelenboom Aug 2, 2026
706751d
Refactor: Drop Workspace's unused ObservableObject conformance
matthijseikelenboom Aug 2, 2026
b42feb8
Refactor: Rename ActivityViewer Notifications group to TaskNotifications
matthijseikelenboom Aug 4, 2026
7808546
Refactor: Rename WorkspaceWindow Toolbar group to TaskToolbarItems
matthijseikelenboom Aug 4, 2026
2988eee
Refactor: Flatten single-file FileInspector group
matthijseikelenboom Aug 4, 2026
769c13f
Refactor: Rename isHovering helper to setHoverCursor
matthijseikelenboom Aug 4, 2026
8a4dd12
Refactor: Name FileIcon's file after the type it declares
matthijseikelenboom Aug 4, 2026
271988a
Refactor: Drop inherited CE prefix from workspace Settings views
matthijseikelenboom Aug 4, 2026
ba5beee
Refactor: Add URL-keyed FileIcon to CodeEditUI
matthijseikelenboom Aug 5, 2026
69b7904
Refactor: Route file icons through CodeEditUI
matthijseikelenboom Aug 5, 2026
2715e31
Fix: Match extension-visibility preferences on the real file extension
matthijseikelenboom Aug 5, 2026
c16d874
Refactor: Retire the FileType enum
matthijseikelenboom Aug 5, 2026
5cace8d
Docs: Record the CodeEditUI charter's local-package-only weakness
matthijseikelenboom Aug 5, 2026
6996279
Fix: Reload the Project Navigator when file-extension preferences change
matthijseikelenboom Aug 5, 2026
6f8d90f
Docs: Record why the 2022 CodeEditModules split failed
matthijseikelenboom Aug 7, 2026
6b8f754
Docs: Reduce package rules to three enforced checks and two norms
matthijseikelenboom Aug 7, 2026
38b386f
Refactor: Consolidate eleven local packages into CodeEditModules
matthijseikelenboom Aug 7, 2026
f5616e4
Fix: Stop tracking the redundant CodeEditModules/Package.resolved
matthijseikelenboom Aug 7, 2026
59cd612
CI: Rewrite the package audit for the consolidated manifest
matthijseikelenboom Aug 7, 2026
9e4c491
Docs: Retarget the remaining tier-era references at CodeEditModules
matthijseikelenboom Aug 7, 2026
62a0da5
Docs: Resolve the standalone-build contradiction in ARCHITECTURE.md
matthijseikelenboom Aug 8, 2026
e69a66e
Test: Add settings format round-trip safety net
matthijseikelenboom Aug 9, 2026
73798aa
Refactor: Lift settings structs out of the SettingsData namespace
matthijseikelenboom Aug 9, 2026
16995b3
Refactor: Give each settings struct a stable section key
matthijseikelenboom Aug 9, 2026
7f24f85
Feat: Add per-section settings reading for feature packages
matthijseikelenboom Aug 9, 2026
bf37d9d
Refactor: Inject terminal settings instead of reading the singleton
matthijseikelenboom Aug 9, 2026
ea721ed
Refactor: Inject source control settings instead of reading the singl…
matthijseikelenboom Aug 9, 2026
a6dd0b5
Fix: Bridge SettingsReading to the Settings.shared singleton
matthijseikelenboom Aug 9, 2026
ba5e8b8
Fix: Reach ToolbarBranchPicker's standalone hosting root with the rea…
matthijseikelenboom Aug 9, 2026
50bc01e
Refactor: Inject language server settings instead of reading the sing…
matthijseikelenboom Aug 9, 2026
84c3a47
Refactor: Give the settings seam a write half
matthijseikelenboom Aug 9, 2026
419d348
Fix: Guard the settings write seam and cover its view-side path
matthijseikelenboom Aug 9, 2026
7bcd37a
Refactor: Cut CEEditor over to the settings-seam @SettingsValue
matthijseikelenboom Aug 9, 2026
204a275
Fix: Give the settings seam an explicit invalidation signal
matthijseikelenboom Aug 9, 2026
f4cc1e8
Fix: Make DefaultSettingsReader's silent fallback loud
matthijseikelenboom Aug 9, 2026
d7acd89
Docs: Document the settings seam and its hosting-boundary hazard
matthijseikelenboom Aug 9, 2026
6a04dad
Test: Clarify what the settings-seam invalidation test guards
matthijseikelenboom Aug 9, 2026
b7623b7
Feat: Add a section-keyed settings store that preserves unknown sections
matthijseikelenboom Aug 10, 2026
581d746
Refactor: Persist settings section by section, preserving unknown sec…
matthijseikelenboom Aug 10, 2026
26300f4
Refactor: Own settings in the composition root and retire the singleton
matthijseikelenboom Aug 10, 2026
4b3c0c7
Fix: Configure settings-backed singletons at composition-root constru…
matthijseikelenboom Aug 10, 2026
0b1c5b2
Refactor: Move SourceControlSettings into CESourceControl
matthijseikelenboom Aug 10, 2026
5336c3d
Refactor: Move TerminalSettings into CETerminal
matthijseikelenboom Aug 10, 2026
6a616db
Refactor: Move LanguageServerSettings into CELSP
matthijseikelenboom Aug 10, 2026
154414a
Docs: Retitle the manifest MARKs and fix stale settings docs
matthijseikelenboom Aug 10, 2026
1e06679
Fix: Inject the settings store into the menu-bar Commands
matthijseikelenboom Aug 10, 2026
7ed38fc
Fix: Preserve a section this build cannot decode before replacing it
matthijseikelenboom Aug 10, 2026
2d9ff58
Docs: Correct the settings-seam comments
matthijseikelenboom Aug 10, 2026
32ff802
Docs: Correct the @AppSettings figures
matthijseikelenboom Aug 10, 2026
e4bd8ec
Refactor: Key the panel tab bar's layout state by tab id
matthijseikelenboom Aug 12, 2026
397f96c
Feat: Add WorkspacePanelContribution
matthijseikelenboom Aug 12, 2026
2e01895
Refactor: Assemble workspace panel tabs from contributions
matthijseikelenboom Aug 12, 2026
f2433e0
Test: Cover panel tab parity and make tab ids compile-checked
matthijseikelenboom Aug 12, 2026
20a1d89
Refactor: Let CESearch vend its own navigator tab
matthijseikelenboom Aug 12, 2026
0b33142
Docs: Document the workspace panel contribution seam
matthijseikelenboom Aug 12, 2026
f4d1dd3
Fix: Isolate WorkspacePanelContribution.content to the main actor
matthijseikelenboom Aug 13, 2026
b46e21a
Feat: Let WorkspaceNavigator open a file by URL
matthijseikelenboom Aug 14, 2026
bee0268
Refactor: Drop the workspace file manager from the source control nav…
matthijseikelenboom Aug 14, 2026
e864634
Refactor: Drop the remaining workspace file manager use from the chan…
matthijseikelenboom Aug 14, 2026
f9f7867
Refactor: Read source control view settings through the seam
matthijseikelenboom Aug 14, 2026
f63918d
Refactor: Move the source control views into CESourceControl
matthijseikelenboom Aug 14, 2026
7b2e515
Refactor: Require the panel contribution dependencies explicitly
matthijseikelenboom Aug 14, 2026
9079899
Docs: Record the source control view relocation
matthijseikelenboom Aug 14, 2026
2db596b
Fix: Apply final review fixes for the source-control view relocation
matthijseikelenboom Aug 14, 2026
96c35f2
Refactor: Move the accounts settings into CESourceControl
matthijseikelenboom Aug 15, 2026
2641484
Docs: Give CodeEditCore's purity rule the justification it actually e…
matthijseikelenboom Aug 15, 2026
206e9db
Refactor: Move Theme into CodeEditCore
matthijseikelenboom Aug 16, 2026
de9a79a
Feat: Add ActiveTheme to CodeEditCore
matthijseikelenboom Aug 16, 2026
39879ce
Refactor: Deliver the active theme through an observable object
matthijseikelenboom Aug 16, 2026
a25c773
Fix: Inject the active theme into the single-file document window
matthijseikelenboom Aug 16, 2026
922c6f8
Fix: Publish theme edits made to the already-active theme
matthijseikelenboom Aug 16, 2026
d44b9b7
Refactor: Convert theme colours through CodeEditUI's hex helper
matthijseikelenboom Aug 16, 2026
8cc2ddd
Refactor: Move the settings store into CodeEditSettings as Persistent…
matthijseikelenboom Aug 16, 2026
fbe8b8e
Refactor: Inject the settings store as an environment object
matthijseikelenboom Aug 16, 2026
31aeeeb
Refactor: Observe the settings store instead of an accessor and revis…
matthijseikelenboom Aug 16, 2026
0bac8ab
Docs: Record where settings sections live, and update the seam guide
matthijseikelenboom Aug 16, 2026
6b6c8df
Merge main (PR #2126: macOS Tahoe Navigator, Inspector, and Utility A…
matthijseikelenboom Aug 19, 2026
1669a89
Fix: Reselect a panel tab when the selected one goes away
matthijseikelenboom Aug 19, 2026
fe5a897
Docs: Bring the architecture guide back in line with the tree
matthijseikelenboom Aug 19, 2026
4e70600
Refactor: Stop routing a filesystem write through a domain type
matthijseikelenboom Aug 19, 2026
7de56dd
Docs: Correct the property named in the Core I/O exception
matthijseikelenboom Aug 19, 2026
b41df26
Refactor: Drop CEWorkspaceFile's FileManager alias
matthijseikelenboom Aug 19, 2026
b785a29
Docs: Replace unenforced claims with the scope rule they were reachin…
matthijseikelenboom Aug 19, 2026
9adcf64
Refactor: Rename UndoManagerRegistration to UndoManagerRegistry
matthijseikelenboom Aug 19, 2026
59194a8
Refactor: Group CEEditor by purpose instead of by kind
matthijseikelenboom Aug 19, 2026
f83a514
Docs: Record CEEditor as the worked example for package folder conven…
matthijseikelenboom Aug 19, 2026
a9c4308
Docs: Say which undo manager the document delegate can actually find
matthijseikelenboom Aug 19, 2026
214a0a1
Refactor: Group CESourceControl by purpose instead of by kind
matthijseikelenboom Aug 19, 2026
f0d59ac
Docs: Record CESourceControl's regrouping and correct the folder count
matthijseikelenboom Aug 19, 2026
ffdce3a
Refactor: Group CENotifications by purpose instead of by kind
matthijseikelenboom Aug 19, 2026
a972518
Docs: Record CENotifications, and make the folder count reproducible
matthijseikelenboom Aug 19, 2026
cf54dba
Refactor: Give CodeEditCore's extensions a subject, and drop a duplicate
matthijseikelenboom Aug 19, 2026
b06af23
Docs: Record CodeEditCore's regrouping and why its layer split stays
matthijseikelenboom Aug 19, 2026
c25dd30
Refactor: Group CETerminal by purpose instead of by kind
matthijseikelenboom Aug 19, 2026
e106623
Docs: Record CETerminal's regrouping
matthijseikelenboom Aug 19, 2026
b903dc1
Refactor: Group CELSP by purpose instead of by kind
matthijseikelenboom Aug 19, 2026
9fb60ca
Docs: Record CELSP's regrouping
matthijseikelenboom Aug 19, 2026
6cae630
Docs: Record why ShellClient stays its own one-file target
matthijseikelenboom Aug 19, 2026
84d139a
Refactor: Make CodeEditUI's Styles folder hold only styles
matthijseikelenboom Aug 19, 2026
ae87f12
Docs: Record CodeEditUI as the second stated exception
matthijseikelenboom Aug 19, 2026
149df39
Docs: Record that the folder-convention sweep covered every target
matthijseikelenboom Aug 20, 2026
357e94e
Docs: Settle whether CodeEditDocument and CELSP should exist
matthijseikelenboom Aug 20, 2026
6f43936
Docs: Delete the Documentation.docc catalog
matthijseikelenboom Aug 20, 2026
d78d5ad
Docs: Make every file header name its own file
matthijseikelenboom Aug 20, 2026
e713a66
Docs: Give the I/O norm the example that proves it, and settle CEWork…
matthijseikelenboom Aug 20, 2026
c43ecde
Docs: Remove em dashes from the architecture guide's prose
matthijseikelenboom Aug 20, 2026
85256b8
Docs: Reflow the architecture guide to one sentence per line
matthijseikelenboom Aug 20, 2026
716209f
Docs: Move the architecture guide to the root and split out the decis…
matthijseikelenboom Aug 21, 2026
dcbb891
Fix: Isolate SettingsValue to the main actor
matthijseikelenboom Aug 22, 2026
0f85e61
Fix: Declare GitClient.Status Sendable
matthijseikelenboom Aug 22, 2026
87b373d
Fix: Declare GitClient.CloneProgress Sendable
matthijseikelenboom Aug 22, 2026
036485a
Fix: Delete SearchState.replaceRange, which was dead and thread-unsafe
matthijseikelenboom Aug 22, 2026
efb4b6f
Fix: Isolate the NSPopUpButton coordinators to the main actor
matthijseikelenboom Aug 22, 2026
b5ad67b
Fix: Isolate SourceControlViewModelTests' setUp and tearDown
matthijseikelenboom Aug 22, 2026
1d9ffbb
Fix: Build the test view model lazily instead of in setUp
matthijseikelenboom Aug 22, 2026
2255475
Fix: Bridge CodeFileDocument's main-actor isolation
matthijseikelenboom Aug 22, 2026
3fa21cd
Fix: Bind the document once in the autosave timer block
matthijseikelenboom Aug 22, 2026
97af3d7
Fix: Make CodeFileDocument's four isolation sites consistent
matthijseikelenboom Aug 22, 2026
9b14359
Docs: Record why the app is not sandboxed
matthijseikelenboom Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
- [ ] My code builds and runs on my machine
- [ ] My changes are all related to the related issue above
- [ ] I documented my code
- [ ] New files follow the placement rules in [docs/ARCHITECTURE.md](https://github.com/CodeEditApp/CodeEdit/blob/main/docs/ARCHITECTURE.md) (features as packages, no cross-feature imports, purpose-first folders)

### Screenshots

Expand Down
167 changes: 167 additions & 0 deletions .github/scripts/audit_package_imports.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
#!/usr/bin/env python3
"""Audit the CodeEditModules package: every `import` must be declared in the
manifest, and the three rules from docs/ARCHITECTURE.md must hold.

Why: for most targets this script is the ONLY defence against a leaky import.
Xcode workspace builds share one build directory, so an undeclared import of a
sibling target compiles fine. The usual backstop — "it breaks a standalone
`swift build`" — does not exist here: external CodeEditSymbols never declares
its .xcassets under `resources:`, so SwiftPM synthesises no `Bundle.module`
accessor and the dependency itself fails to compile. 7 of the 12 targets need it
transitively, so plain `swift build` is unavailable for them and nothing else
would catch the violation. Hence manifest honesty is a PR gate.

Usage: python3 .github/scripts/audit_package_imports.py (from anywhere)
"""
import re
import sys
from pathlib import Path

REPO = Path(__file__).resolve().parents[2]
PACKAGE = REPO / "CodeEditModules"
MANIFEST = PACKAGE / "Package.swift"

# Apple SDK modules used in this codebase; extend when a new system framework is adopted.
SYSTEM_MODULES = {
"Foundation", "FoundationNetworking", "SwiftUI", "AppKit", "Cocoa", "Combine",
"CoreGraphics", "OSLog", "os", "PDFKit", "QuickLookUI", "RegexBuilder",
"UniformTypeIdentifiers", "UserNotifications", "AVKit", "CryptoKit", "Security",
"Swift", "XCTest", "Testing",
}

UI_FRAMEWORKS = {"SwiftUI", "AppKit", "Cocoa"}

# Rule 4: the single target permitted to opt out of Swift 6.
SWIFT5_ALLOWED = {"CEEditor"}

IMPORT_RE = re.compile(
r"^\s*(?:@[\w()]+\s+)?import\s+(?:struct\s+|class\s+|enum\s+|func\s+|var\s+)?([A-Za-z_][A-Za-z0-9_]*)",
re.MULTILINE,
)
TARGET_START_RE = re.compile(r"\.(target|testTarget)\(\s*name:\s*\"([^\"]+)\"")


def balanced_block(text, open_index):
"""Return text from the '(' at open_index through its matching ')'."""
depth = 0
for i in range(open_index, len(text)):
if text[i] == "(":
depth += 1
elif text[i] == ")":
depth -= 1
if depth == 0:
return text[open_index:i + 1]
raise ValueError("unbalanced parentheses in manifest")


def parse_targets(text):
"""Map target name -> {kind, deps, swift_modes} from the manifest."""
targets = {}
for match in TARGET_START_RE.finditer(text):
kind, name = match.group(1), match.group(2)
paren = text.index("(", match.start())
block = balanced_block(text, paren)
deps = set(re.findall(r'"([A-Za-z][\w.\-]*)"', _dependencies_slice(block)))
deps |= set(re.findall(r'\.product\(\s*name:\s*"([^"]+)"', block))
deps.discard(name)
targets[name] = {
"kind": kind,
"deps": deps,
"swift_modes": set(re.findall(r"\.swiftLanguageMode\(\.(\w+)\)", block)),
}
return targets


def _dependencies_slice(block):
"""The text inside this target's `dependencies: [...]`, or '' if absent."""
match = re.search(r"dependencies:\s*\[", block)
if not match:
return ""
start = block.index("[", match.start())
depth = 0
for i in range(start, len(block)):
if block[i] == "[":
depth += 1
elif block[i] == "]":
depth -= 1
if depth == 0:
return block[start:i + 1]
return ""


def main() -> int:
if not MANIFEST.exists():
print(f"Package audit FAILED: no manifest at {MANIFEST}")
return 1

text = MANIFEST.read_text()
targets = parse_targets(text)
library_targets = {n for n, t in targets.items() if t["kind"] == "target"}
failures = []

# --- Rule 1: CodeEditCore purity (manifest half) ---
if targets.get("CodeEditCore", {}).get("deps"):
failures.append(
"CodeEditCore must have zero dependencies "
f"(found {sorted(targets['CodeEditCore']['deps'])})"
)

# --- Rule 2: CodeEditUI purity ---
ui_local = targets.get("CodeEditUI", {}).get("deps", set()) & library_targets
if ui_local:
failures.append(
"CodeEditUI may not depend on local targets — CodeEditSymbols only "
f"(found {sorted(ui_local)})"
)

# --- Rule 4: language-mode assertion ---
for name, target in sorted(targets.items()):
if "v5" in target["swift_modes"] and name not in SWIFT5_ALLOWED:
failures.append(
f"{name}: only {sorted(SWIFT5_ALLOWED)} may declare .swiftLanguageMode(.v5) — "
"every other target must stay on Swift 6"
)

# --- Rule 3: import honesty, plus Rule 1's no-UI half ---
for name, target in sorted(targets.items()):
source_dir = PACKAGE / ("Tests" if target["kind"] == "testTarget" else "Sources") / name
if not source_dir.is_dir():
failures.append(f"{name}: declared in the manifest but {source_dir} does not exist")
continue
system_modules = SYSTEM_MODULES - UI_FRAMEWORKS if name == "CodeEditCore" else SYSTEM_MODULES
allowed = target["deps"] | system_modules | {name}
for swift in sorted(source_dir.rglob("*.swift")):
rel = swift.relative_to(REPO)
for module in sorted(set(IMPORT_RE.findall(swift.read_text()))):
if module not in allowed:
failures.append(f"{rel}: import {module} is not declared for target {name}")
if name == "CodeEditCore" and module in UI_FRAMEWORKS:
failures.append(f"{rel}: {module} import violates the CodeEditCore no-UI rule")

if failures:
print(f"Package audit FAILED ({len(failures)} violations):")
for failure in failures:
print(f" {failure}")
return 1

# --- Norm (informational only): hub heuristic ---
dependents = {n: 0 for n in targets}
for target in targets.values():
for dep in target["deps"]:
if dep in dependents:
dependents[dep] += 1
hubs = sorted(
n for n, t in targets.items()
if t["kind"] == "target"
and dependents[n] >= 3
and len(t["deps"] & library_targets) >= 3
)
if hubs:
print(f"Note — hub targets under review (>=3 dependents and >=3 local deps): {hubs}")

print(f"Package audit passed ({len(library_targets)} library targets).")
return 0


if __name__ == "__main__":
sys.exit(main())
1 change: 1 addition & 0 deletions .github/scripts/test_app.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export LC_CTYPE=en_US.UTF-8
# - is-ci: include test results in output

set -o pipefail && arch -"${ARCH}" xcodebuild \
-workspace CodeEdit.xcworkspace \
-scheme CodeEdit \
-destination "platform=OS X,arch=${ARCH}" \
-skipPackagePluginValidation \
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,5 @@ jobs:
- uses: actions/checkout@v3
- name: GitHub Action for SwiftLint
run: swiftlint --reporter github-actions-logging --strict
- name: Audit package imports and tier rules
run: python3 .github/scripts/audit_package_imports.py
2 changes: 1 addition & 1 deletion .github/workflows/pre-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
- name: Build CodeEdit
env:
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
run: xcodebuild -scheme CodeEdit -configuration Pre -derivedDataPath "$RUNNER_TEMP/DerivedData" -archivePath "$RUNNER_TEMP/CodeEdit.xcarchive" -skipPackagePluginValidation DEVELOPMENT_TEAM=$APPLE_TEAM_ID archive | xcpretty
run: xcodebuild -workspace CodeEdit.xcworkspace -scheme CodeEdit -configuration Pre -derivedDataPath "$RUNNER_TEMP/DerivedData" -archivePath "$RUNNER_TEMP/CodeEdit.xcarchive" -skipPackagePluginValidation DEVELOPMENT_TEAM=$APPLE_TEAM_ID archive | xcpretty

############################
# Sign
Expand Down
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ playground.xcworkspace

.build/

# Resolved file for the local CodeEditModules package — the workspace's
# shared Package.resolved is authoritative; this is Xcode/SwiftPM-generated noise.
CodeEditModules/Package.resolved
CodeEditModules/.swiftpm/

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
Expand Down Expand Up @@ -96,3 +101,8 @@ iOSInjectionProject/
.codeedit
.idea
.vscode

# The .xcodeproj's implicit workspace is not a build entry point — CodeEdit.xcworkspace is.
# Xcode regenerates this lockfile whenever the bare project is opened; it drifts and misleads.
# The app bundles the workspace's lockfile as its Acknowledgements data source.
CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
15 changes: 14 additions & 1 deletion .swiftlint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ identifier_name:

# paths to ignore during linting.
excluded:
- CodeEditModules/.build # Where Swift Package Manager checks out dependency sources
- "**/.build" # SwiftPM dependency checkouts (inside CodeEditModules/)
- "**/.swiftpm"
- DerivedData

opt_in_rules:
Expand All @@ -38,3 +39,15 @@ custom_rules:
regex: "\t"
message: "Prefer spaces for indents over tabs. See Xcode setting: 'Text Editing' -> 'Indentation'"
severity: warning
no_ui_in_core:
included: "CodeEditModules/Sources/CodeEditCore/.*\\.swift"
name: "CodeEditCore charter"
regex: "^import (SwiftUI|AppKit|Cocoa)$"
message: "CodeEditCore must stay UI-free — move UI-coupled code to CodeEditUI or the owning feature (see docs/ARCHITECTURE.md)"
severity: error
ui_package_purity:
included: "CodeEditModules/Sources/CodeEditUI/.*\\.swift"
name: "CodeEditUI charter"
regex: "^import (CodeEditCore|CodeEditDocument|CodeEditSettings|CEEditor|CESearch|CENotifications|CELSP|CESourceControl|CETerminal|ShellClient|CEWorkspaceFileManager)$"
message: "CodeEditUI depends on CodeEditSymbols only — presentation atoms must not know about models or features (see docs/ARCHITECTURE.md)"
severity: error
Loading
Loading