[2026-05-22] fix skip-fuse-ui pitfall, add folder picker feature plan

This commit is contained in:
Alexey Martemyanov
2026-05-22 10:43:09 +06:00
parent 3ad4c00234
commit b1b7bee648
2 changed files with 19 additions and 6 deletions
@@ -107,6 +107,17 @@ Apple требует дисклеймер: "Не является заменой
- После сброса: онбординг с чистого листа
- Реализует GDPR-требование "право на удаление" (см. [[privacy-legal]])
- **Папка документов** — пикер системной папки для хранения/чтения сессий
- Расположение: под кнопкой "Пропустить" на стартовом экране + отдельная секция в Настройках
- Позволяет выбрать любую папку (iCloud Drive, локальная, внешний диск на iPad)
- По умолчанию: стандартная `Documents/UserProfile/` — ничего не ломается
- Нужно для переноса данных между устройствами (резервная копия, смена телефона)
- iOS: `.fileImporter(allowedContentTypes: [.folder])` (SwiftUI, iOS 14+)
- Возвращает security-scoped URL → сохраняется как bookmark в UserDefaults
- `startAccessingSecurityScopedResource()` / `stopAccessingSecurityScopedResource()` при каждом доступе
- Android (`#if SKIP`): `Intent.ACTION_OPEN_DOCUMENT_TREE` → URI с `takePersistableUriPermission`
- ProfileManager читает путь из UserDefaults (bookmark на iOS, URI string на Android)
### Структура сессии
1. **Check-in** (2 мин): короткий mood check через карточки
2. **Тема** (выбирает пользователь или AI предлагает из паттернов)
@@ -686,6 +697,7 @@ Phase 2 — Voice + Android (6-8 недель)
├── OpenAI Realtime API интеграция
├── Skip.tools → Android версия
├── Persistence: профиль пользователя + recurring topics
├── Импорт/экспорт папки данных (iOS + Android file picker)
└── Подписка через RevenueCat
Phase 3 — Launch & Marketing (2-4 недели)
+7 -6
View File
@@ -44,24 +44,25 @@ skip gradle assembleDebug
```swift
// Package.swift обязательные поля
products: [
.library(name: "ReflectApp", targets: ["ReflectApp"])
dependencies: [
.package(url: "https://source.skip.tools/skip.git", from: "1.8.9"),
.package(url: "https://source.skip.tools/skip-fuse.git", from: "1.0.0"),
.package(url: "https://source.skip.tools/skip-fuse-ui.git", from: "1.0.0"),
],
targets: [
.target(
name: "ReflectApp",
path: "Sources/ReflectApp",
dependencies: [
.product(name: "SkipFuse", package: "skip-fuse"),
.product(name: "SkipUI", package: "skip-ui"),
// НЕ добавлять skip-fuse-ui как отдельную зависимость
.product(name: "SkipFuse", package: "skip-fuse"),
.product(name: "SkipFuseUI", package: "skip-fuse-ui"),
],
plugins: [.plugin(name: "skipstone", package: "skip")]
)
]
```
**Pitfall:** `skip-fuse-ui` как отдельный product не существует — нужны `skip-fuse` + `skip-ui` раздельно.
**Pitfall:** нужны оба: `skip-fuse` (runtime) + `skip-fuse-ui` (SwiftUI overlay для Android). Ранее была попытка использовать `skip-ui` вместо `skip-fuse-ui` — это неверно, `skip-ui` не предоставляет `SwiftUI` модуль для Android-сборки и ломает full build с `no such module 'SwiftUI'`.
## Прочие питфоллы