Skip to content

Commit 45eb0cd

Browse files
committed
release: 1.0.0 docs + version bump
1 parent 51d0cec commit 45eb0cd

File tree

5 files changed

+104
-61
lines changed

5 files changed

+104
-61
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,6 @@ xcuserdata/
2121
*.ipa
2222
*.dSYM.zip
2323
*.dSYM
24+
25+
# Local screenshots (generated for simulator demos)
26+
docs/screenshots/

README.md

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,29 @@
44

55
# ClipDock
66

7-
ClipDock is an iOS app that helps users move videos from iPhone Photos to external storage, then delete originals to free up device space.
7+
ClipDock is an iOS app that helps you copy selected videos from iPhone Photos to an external folder (Files), then optionally delete originals to free up device space.
88

99
[![CI](https://github.com/Wenfeng-GAO/clipdock/actions/workflows/ci.yml/badge.svg)](https://github.com/Wenfeng-GAO/clipdock/actions/workflows/ci.yml)
1010

11-
## Current docs
11+
## Docs (1.0)
1212

13-
- Product doc: `docs/product.md`
14-
- Development doc: `docs/development.md`
15-
- Project plan (3-day sprint): `docs/project-plan.md`
13+
- Product doc: `docs/releases/1.0/product.md`
14+
- Development doc: `docs/releases/1.0/development.md`
15+
- App Store prep: `docs/app-store/app-store-connect.md`
1616

17-
## Current implementation status
17+
## Key Features (1.0)
1818

19-
- M0: Project scaffold completed.
20-
- M1: Photo permission flow completed.
21-
- M2: External folder picker + security-scoped bookmark completed.
22-
- M3 (minimal): Video scan sorted by date (desc) completed.
19+
- Choose an external destination folder (security-scoped bookmark).
20+
- Scan videos from Photos.
21+
- Sort by date or size (local-only, best-effort).
22+
- Select videos manually, Select All, or use Quick Filter (by year/month and/or Top-N by size).
23+
- Migrate (copy) selected videos to the destination folder.
24+
- After a successful migration run, optionally delete migrated originals (explicit confirmation).
25+
26+
## Notes / Limitations
27+
28+
- Video size is best-effort and local-only (iCloud-only items may show `--` until downloaded/exported).
29+
- Migration is most reliable when ClipDock stays in the foreground; background execution is limited by iOS.
2330

2431
## Local setup
2532

@@ -44,6 +51,11 @@ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
4451

4552
GitHub Actions runs `xcodegen generate` and `xcodebuild test` on PRs and `main`.
4653

54+
## App Store Links
55+
56+
- Privacy Policy: https://wenfeng-gao.github.io/clipdock/app-store/privacy-policy.html
57+
- Support: https://wenfeng-gao.github.io/clipdock/app-store/support.html
58+
4759
## License
4860

4961
MIT. See `LICENSE`.

docs/releases/1.0/development.md

Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,27 @@
2222
3. 删除更克制:删除入口在迁移完成后出现,且仅在满足权限与校验条件时可用。
2323

2424
### 2.2 页面结构(单页)
25-
建议从现有 `List + 多 Section` 调整为“顶部状态卡 + 列表 + 底部操作区”的结构:
26-
27-
1. 顶部状态卡(2 张卡片)
28-
- 目录卡:已选目录、可写状态、`Choose` / `Recheck` 按钮
29-
- 权限卡:相册权限状态、`Grant` 按钮
30-
2. 扫描与排序卡
31-
- `Scan Videos` CTA
32-
- 排序 `Date/Size`(保持 segmented)
33-
- `Loading sizes...` 次级提示
34-
3. 选择卡
35-
- 手动选择提示 + 统计(已选数量)
36-
- 规则选择入口:
37-
- `By Month...`(弹层 Month Picker)
38-
- `Top N...`(弹层 N 输入 + 应用)
39-
- `Show selected only``Select all``Clear`
40-
4. 列表(虚拟化)
41-
- 仅负责展示与勾选,不承载迁移/删除按钮
42-
5. 底部操作区(sticky)
43-
- Primary:`Start Migration`
44-
- Secondary:`Delete Migrated Originals`(仅在迁移完成且 deletable>0 时可用)
45-
- Progress:进度条 + 当前文件名(迁移中)
46-
- 结果摘要:成功/失败数(迁移后)
47-
48-
### 2.3 弹层 A:按月份选择(Month Picker)
49-
1. 数据来源:扫描完成后按 `creationDate` 生成 `YYYY-MM` 分组。
50-
2. 展示:月份列表(YYYY-MM)+ 视频数量;支持多选月份。
51-
3. 动作:`Apply` 将所选月份的全部视频加入选中集合;`Clear` 清空月份选择。
52-
53-
### 2.4 弹层 B:最大 N(Top-N Picker)
54-
1. 输入:N(快捷按钮 20/50/100 + 自定义输入)。
55-
2. 规则:对“当前排序结果”取前 N(如果启用“仅看已选”,则对过滤后的列表取前 N)。
56-
3. 说明:当排序为 `Size` 时,未知 size 的视频排在底部,Top-N 默认只会命中已知 size 的条目。
25+
当前实现为“卡片式单页 + 底部操作区”:
26+
27+
1. 目录卡
28+
- 已选目录、可写状态、`Choose` / `Recheck`
29+
2. 扫描与选择卡(Scan & Select)
30+
- `Scan Videos` CTA(当授权状态为 `notDetermined` 时会触发系统弹窗;拒绝时给出提示)。
31+
- 统计:视频数量、已选数量、已选总大小(best-effort)。
32+
- 入口:`Select All` / `Quick Filter` / `Clear``Show selected only`
33+
3. 列表卡(Video List)
34+
- 列表顶部提供排序:字段 `Date/Size`(segmented)+ 正/倒序按钮。
35+
- 列表行支持点选切换选择;size 异步补齐。
36+
4. 底部操作区(sticky)
37+
- `Start Migration` / `Delete Originals`
38+
- 迁移中:进度条 + completed/total + 当前文件名。
39+
- 迁移后:成功/失败摘要 + 失败列表入口。
40+
- 状态策略:迁移完成且可删时,Start 置灰,Delete 变为强调态;删除后 Delete 置灰。
41+
42+
### 2.3 弹层:快捷筛选(Quick Filter)
43+
1. 按月份:按“年份 -> 月份”分组展示(DisclosureGroup),并支持多选月份。
44+
2. Top-N:输入 N(20/50/100 快捷),基于本地可得 size 的 “largest first”。
45+
3. 动作:`Cancel / Apply`,且 `Apply` 仅在用户设置了筛选条件时可用。
5746

5847
## 3. 后端实现方式(MVVM + Services)
5948

@@ -86,6 +75,7 @@
8675
### 3.5 size 获取与 Top-N 边界
8776
1. size 读取使用 public API,且 `isNetworkAccessAllowed=false`,不会触发 iCloud 下载。
8877
2. Top-N 选择与大小排序不强制要求 size 全量完成;未知 size 统一视为“排序靠后”,并在 UI 里显示 `--`
78+
3. 1.0 为了让“大小排序”更确定,扫描完成后会后台预取全库本地 size(best-effort)。
8979

9080
### 3.6 迁移与删除
9181
1. 迁移:保持“导出到临时目录 -> `NSFileCoordinator` 写入目标目录”,持有 security scope 覆盖整个迁移任务。
@@ -124,7 +114,7 @@
124114
### 2026-02-13 - 规则选择(按月份 / Top-N)+ 去除 History 入口
125115
1. 交付:
126116
- 新增规则选择服务 `SelectionRulesService`(按月份分组 + Top-N 选择)。
127-
- UI 增加 `By Month...` / `Top N...` 弹层入口。
117+
- UI 增加 `By Month...` / `Top N...` 弹层入口(后续在 1.0 收敛为 `Quick Filter`
128118
- 移除 `History` 相关 UI 入口(按 1.0 形态要求)。
129119
2. 关键文件:
130120
- `/Users/wenfeng/Documents/iphoneapp/ClipDock/Services/Selection/SelectionRulesService.swift`
@@ -195,3 +185,31 @@
195185
- `/Users/wenfeng/Documents/iphoneapp/ClipDock/Resources/zh-Hans.lproj/Localizable.strings`
196186
3. 验证:
197187
- `xcodebuild test`(Simulator):16 tests / 0 failure。
188+
189+
### 2026-02-14 - 视觉收敛:移除 Home 大标题
190+
1. 交付:
191+
- Home 页面移除导航标题 “ClipDock”,减少无效占位,保留右上角 `info` 入口。
192+
2. 关键文件:
193+
- `/Users/wenfeng/Documents/iphoneapp/ClipDock/Features/Home/HomeView.swift`
194+
3. 验证:
195+
- `xcodebuild test`(Simulator):通过。
196+
197+
### 2026-02-14 - 快捷筛选:月份按年份分组(可折叠)
198+
1. 交付:
199+
- `Quick Filter` 的月份列表按 `Year -> Months` 分组展示,支持展开/收起,缓解月份列表过长问题。
200+
- 新增单测覆盖长列表(6 年 * 12 月 + unknown)。
201+
2. 关键文件:
202+
- `/Users/wenfeng/Documents/iphoneapp/ClipDock/Features/Home/RulePickers/MonthSummaryGrouper.swift`
203+
- `/Users/wenfeng/Documents/iphoneapp/ClipDock/Features/Home/RulePickers/QuickFilterView.swift`
204+
- `/Users/wenfeng/Documents/iphoneapp/ClipDockTests/MonthSummaryGrouperTests.swift`
205+
3. 验证:
206+
- `xcodebuild test`(Simulator):通过。
207+
208+
### 2026-02-14 - 迁移操作条:完成后引导删除
209+
1. 交付:
210+
- 迁移完成且存在可删条目时:`Start Migration` 置灰,`Delete Originals` 变为强调态(红色)。
211+
- 删除完成并触发 rescan 后:`Delete Originals` 置灰。
212+
2. 关键文件:
213+
- `/Users/wenfeng/Documents/iphoneapp/ClipDock/Features/Home/MigrationActionBar.swift`
214+
3. 验证:
215+
- `xcodebuild test`(Simulator):通过。

docs/releases/1.0/product.md

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# ClipDock 1.0 PRD(设计稿)
22

3-
更新时间:2026-02-13
3+
更新时间:2026-02-14
44

55
本文基于已完成的 MVP,定义 1.0 版本“产品内容与形态”。1.0 目标:更清晰、更克制、更像一个可长期使用的工具 App;同时为 App Store 上架做准备(不引入高风险实现)。
66

7+
发布版本:`1.0.0`
8+
79
## 1. 1.0 产品定位
810

911
ClipDock 是一款离线工具,用于将 iPhone 相册中的视频复制到用户选择的目标目录(可为外接存储目录),并在用户确认后删除原视频以释放空间。
@@ -21,37 +23,39 @@ ClipDock 是一款离线工具,用于将 iPhone 相册中的视频复制到用
2123
4. 迁移策略:更稳(串行)。
2224
5. 视觉风格:干净克制。
2325

24-
## 3. 1.0 核心用户流程(单页 + 两个轻弹层
26+
## 3. 1.0 核心用户流程(单页 + 一个轻弹层
2527

2628
单页仍以“迁移主流程”为主,但做信息密度重排,减少当前长列表造成的认知负担。
2729

2830
1. 选择外接目录
2931
2. 扫描视频
30-
3. 通过“规则选择”或“手动勾选”确定迁移集合
32+
3. 通过“快捷筛选 / 全选 / 手动勾选”确定迁移集合
3133
4. 开始迁移(串行)
3234
5. 展示结果(成功/失败 + 失败原因列表)
3335
6. 可选删除原视频(仅成功且校验通过的条目)
3436

35-
弹层 A:按月份选择(Month Picker)
36-
1. 列出可用月份(YYYY-MM),显示每个月的视频数量(以及可选:已知大小合计)
37-
2. 支持:选择某个月 -> 一键选中该月所有视频
38-
3. 支持:多月叠加选择
39-
40-
弹层 B:最大 N 选择(Top-N Picker)
41-
1. 输入 N(默认 20,可快速 20/50/100)
42-
2. 选择策略(1.0 先固定为):按“大小从大到小”取 Top N
43-
3. 对 size 未知项的处理(1.0 规则):
44-
- 未知 size 的视频不参与 Top-N 计算(避免误选),但用户仍可手动勾选
37+
弹层:快捷筛选(Quick Filter)
38+
1. 按月份筛选:
39+
- 按“年份 -> 月份”分组展示,减少月份列表过长导致的滚动成本。
40+
- 多月可叠加。
41+
2. Top-N 筛选:
42+
- 输入 N(默认 20,可快速 20/50/100)。
43+
- 固定策略:按“大小从大到小”取 Top N(基于本地可得 size)。
44+
3. 按钮与状态:
45+
- `Cancel / Apply`;仅当用户设置了筛选条件时 `Apply` 才可用。
46+
4. 对 size 未知项的处理:
47+
- 未知 size 的视频不参与 Top-N 计算(避免误选),但用户仍可手动勾选。
4548

4649
## 4. 1.0 功能范围(Must/Should)
4750

4851
### 4.1 Must(1.0 必须交付)
4952
1. UI 重排为“单流程面板”
5053
- 顶部:目录状态 + 可写状态
51-
- 中部:扫描与排序(日期/大小)
52-
- 中部:规则选择入口(按月份、最大 N)
54+
- 中部:扫描与选择(含“已选数量/已选大小”统计)
55+
- 中部:快捷筛选入口(按月份/Top-N)
56+
- 列表:排序(日期/大小 + 正序/倒序)
5357
- 底部:迁移与进度、删除入口、结果摘要
54-
2. 批量选择规则(按月份、最大 N)
58+
2. 批量选择规则(快捷筛选:按月份、最大 N)
5559
3. 稳定迁移(串行 + 可重试失败项)
5660
4. 删除安全闸门(保持 MVP 的安全约束)
5761
5. i18n(已做):中英跟随系统
@@ -93,3 +97,9 @@ ClipDock 是一款离线工具,用于将 iPhone 相册中的视频复制到用
9397
2. size 为 best-effort:iCloud-only 资产可能显示 `--`,Top-N 不包含未知 size 项,避免误选。
9498
3. 串行优先:吞吐更低,但稳定性更好,也更符合“清理工具”的风险偏好。
9599

100+
## 8. 1.0 现状总结(已完成)
101+
102+
1. 单页流程:外接目录 -> 扫描 -> 选择/快捷筛选 -> 迁移 -> 结果 -> 删除。
103+
2. 快捷筛选:按年份分组的月份筛选 + Top-N(按本地 size)。
104+
3. 选择统计:展示“已选总大小”(best-effort),并提示已知大小数量。
105+
4. 操作引导:迁移完成后 `Start Migration` 变暗,`Delete Originals` 变亮;删除后恢复为不可用。

project.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ options:
66
settings:
77
base:
88
SWIFT_VERSION: 5.0
9-
CURRENT_PROJECT_VERSION: 8
10-
MARKETING_VERSION: 0.2.6
9+
CURRENT_PROJECT_VERSION: 9
10+
MARKETING_VERSION: 1.0.0
1111
CODE_SIGN_STYLE: Automatic
1212
configs:
1313
Debug: debug

0 commit comments

Comments
 (0)