Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ File Provider experience.
- UI: SwiftUI app shell
- Build system: Xcode project, not Tuist and not a root Swift Package
- Scheme: `potassiumProvider`
- Targets: `potassiumProvider`, `potassiumProviderTests`,
`potassiumProviderUITests`
- Targets: `potassiumProvider`, `PotassiumProviderCore`,
`potassiumProviderFileProvider`, `potassiumProviderActions`,
`potassiumProviderTests`, and `potassiumProviderUITests`
- Supported validation platforms: iOS Simulator, macOS, and visionOS
- Dependencies: `SQLite.swift` and `potassiumChannel` package products
`PotassiumChannelCore`, `PotassiumKDrive`, and `PotassiumOAuth`
Expand All @@ -21,6 +22,10 @@ File Provider experience.
```text
potassiumProvider/
|-- potassiumProvider/ # App target; SwiftUI entry point and views
|-- PotassiumProviderCore/ # Shared models, service adapters, and storage
|-- potassiumProviderFileProvider/
| # Replicated provider and background actions
|-- potassiumProviderActions/ # File Provider UI contextual panels
|-- potassiumProviderTests/ # Swift Testing unit tests
|-- potassiumProviderUITests/ # XCTest UI automation tests
|-- potassiumProvider.xcodeproj/ # Source of truth for targets, scheme, settings,
Expand Down
37 changes: 37 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,42 @@
# Changelog

## 0.3.0

### Added

- Finder/Files actions to add or remove kDrive favorites, duplicate items
server-side, and restore items from trash with root fallback when the
original parent is gone.
- A cross-platform File Provider UI extension for share-link management and
paged document version history with non-destructive “Restore as Copy.”
- Favorite and trash metadata used by native File Provider presentation and
action predicates.
- Native lazy/offline metadata so the system can present Download Now and
Remove Download.
- Per-drive Show in Finder/Files and Sync Now controls in the app.
- Sanitized favorite, duplicate, restore, share-link, and version-restore
activity in the existing timeline.

### Changed

- Snapshot generation and legacy snapshot tables now retain nullable favorite
state with an in-place SQLite migration. Older snapshot and working-set JSON
remains decodable.
- Successful local mutations invalidate and signal each affected folder plus
the working set.
- Release version is `0.3.0` with build number `4`.

### Dependency state

- potassiumChannel remains pinned to `0.2.0`.
- Contextual operations use only existing typed `PotassiumKDrive` 0.2.0
service methods; no local ad hoc HTTP requests were added.

### Security

- Share URLs and passwords remain view-model memory only. They are not written
to domain JSON, SQLite, activity rows, support logs, or unified logs.

## 0.2.1

### Fixed
Expand Down
16 changes: 16 additions & 0 deletions Config/potassiumProviderActions.entitlements
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.net.weavee.potassiumProvider</string>
</array>
<key>com.apple.security.network.client</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)net.weavee.potassiumProvider</string>
</array>
</dict>
</plist>
50 changes: 50 additions & 0 deletions Config/potassiumProviderActionsInfo.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Potassium Actions</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.fileprovider-actionsui</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).ProviderActionViewController</string>
<key>NSExtensionFileProviderActions</key>
<array>
<dict>
<key>NSExtensionFileProviderActionIdentifier</key>
<string>net.weavee.potassiumProvider.action.shareLink</string>
<key>NSExtensionFileProviderActionName</key>
<string>Share kDrive Link…</string>
<key>NSExtensionFileProviderActionActivationRule</key>
<string>fileproviderItems.@count == 1 AND SUBQUERY(fileproviderItems, $item, $item.userInfo.isRoot == NO AND $item.userInfo.isTrashed == NO).@count == 1</string>
</dict>
<dict>
<key>NSExtensionFileProviderActionIdentifier</key>
<string>net.weavee.potassiumProvider.action.versionHistory</string>
<key>NSExtensionFileProviderActionName</key>
<string>Version History…</string>
<key>NSExtensionFileProviderActionActivationRule</key>
<string>fileproviderItems.@count == 1 AND SUBQUERY(fileproviderItems, $item, $item.userInfo.isRoot == NO AND $item.userInfo.isTrashed == NO AND $item.userInfo.isDirectory == NO).@count == 1</string>
</dict>
</array>
</dict>
</dict>
</plist>
35 changes: 35 additions & 0 deletions Config/potassiumProviderFileProviderInfo.plist
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,41 @@
<true/>
<key>NSExtensionFileProviderDocumentGroup</key>
<string>group.net.weavee.potassiumProvider</string>
<key>NSExtensionFileProviderActions</key>
<array>
<dict>
<key>NSExtensionFileProviderActionIdentifier</key>
<string>net.weavee.potassiumProvider.action.addFavorite</string>
<key>NSExtensionFileProviderActionName</key>
<string>Add to kDrive Favorites</string>
<key>NSExtensionFileProviderActionActivationRule</key>
<string>fileproviderItems.@count == 1 AND SUBQUERY(fileproviderItems, $item, $item.userInfo.isRoot == NO AND $item.userInfo.isTrashed == NO AND $item.userInfo.isFavorite == NO).@count == 1</string>
</dict>
<dict>
<key>NSExtensionFileProviderActionIdentifier</key>
<string>net.weavee.potassiumProvider.action.removeFavorite</string>
<key>NSExtensionFileProviderActionName</key>
<string>Remove from kDrive Favorites</string>
<key>NSExtensionFileProviderActionActivationRule</key>
<string>fileproviderItems.@count == 1 AND SUBQUERY(fileproviderItems, $item, $item.userInfo.isRoot == NO AND $item.userInfo.isTrashed == NO AND $item.userInfo.isFavorite == YES).@count == 1</string>
</dict>
<dict>
<key>NSExtensionFileProviderActionIdentifier</key>
<string>net.weavee.potassiumProvider.action.duplicate</string>
<key>NSExtensionFileProviderActionName</key>
<string>Duplicate on kDrive</string>
<key>NSExtensionFileProviderActionActivationRule</key>
<string>fileproviderItems.@count == 1 AND SUBQUERY(fileproviderItems, $item, $item.userInfo.isRoot == NO AND $item.userInfo.isTrashed == NO).@count == 1</string>
</dict>
<dict>
<key>NSExtensionFileProviderActionIdentifier</key>
<string>net.weavee.potassiumProvider.action.restoreFromTrash</string>
<key>NSExtensionFileProviderActionName</key>
<string>Restore from kDrive Trash</string>
<key>NSExtensionFileProviderActionActivationRule</key>
<string>fileproviderItems.@count == 1 AND SUBQUERY(fileproviderItems, $item, $item.userInfo.isRoot == NO AND $item.userInfo.isTrashed == YES).@count == 1</string>
</dict>
</array>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.fileprovider-nonui</string>
<key>NSExtensionPrincipalClass</key>
Expand Down
Loading