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
11 changes: 11 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,17 @@ jobs:
POCKETROOT_SMOKE_TIMEOUT_SECONDS: "600"
run: ./Scripts/run-runtime-smoke.sh

- name: Run Quick Start two-entry UI smoke with Xcode 16.0
run: ./Scripts/run-quick-start-ui-smoke.sh

- name: Run Quick Start iPad UI smoke with Xcode 16.0
env:
POCKETROOT_QUICK_START_UI_DEVICE_TYPE: >-
com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation
POCKETROOT_QUICK_START_UI_DEVICE_NAME: >-
PocketRoot-Quick-Start-iPad-UI-Smoke
run: ./Scripts/run-quick-start-ui-smoke.sh

- name: Run Host App PTY and Files UI smoke with Xcode 16.0
run: ./Scripts/run-host-app-ui-smoke.sh

Expand Down
4 changes: 3 additions & 1 deletion CHANGELOG.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,9 @@ All notable PocketRoot changes are recorded here. Semantic Versioning begins wit
- Direct Terminal and Files entry points on `PocketRootIshWorkspaceHost`.
Screens prepare and boot automatically without consumer-side `readySystem`
polling. A two-button `Examples/PocketRootQuickStartApp` is final-linked in
CI and its pinned Debug RootFS is verified.
CI and its pinned Debug RootFS is verified. iPhone/iPad UI smoke covers cold
Files and Terminal auto-boot and previews a real PTY-created file through
Files; Quick Start and Host App share one bounded Simulator runner.
- Unified iOS 18 deployment baseline.
- Experimental `PocketRootIshRuntime` pinned to IshEmbed release revision `38d25d6f8726145e7e988172f12000020d89a638` and the `v0.4.0-abi.6` XCFramework.
- Experimental `PocketRootIshRuntime` upgraded to IshEmbed release revision
Expand Down
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@ PocketRoot 的重要变化记录在这里。首个公开版本发布后遵循 Se
并发 boot 合并,页面退出只关闭 PTY,显式 shutdown 先关闭全部 host Workspace。
- 为 `PocketRootIshWorkspaceHost` 加入独立 Terminal 与 Files 公共入口;页面自动
prepare/boot,无需业务层轮询 `readySystem`。新增只有两个按钮的
`Examples/PocketRootQuickStartApp`,并在 CI 中最终链接和核对固定 Debug RootFS。
`Examples/PocketRootQuickStartApp`,并在 CI 中最终链接和核对固定 Debug RootFS;
iPhone/iPad UI smoke 从冷启动分别验证 Files 与 Terminal 自动 boot,并确认真实
PTY 创建的文件可由 Files 预览。Quick Start 与 Host App 复用同一个有界 Simulator
runner。
- 统一 package、Demo、tests 和 CI 的 iOS 18.0 deployment baseline。
- 固定 Experimental `PocketRootIshRuntime` 到 IshEmbed release revision `38d25d6f8726145e7e988172f12000020d89a638` 与 `v0.4.0-abi.6` XCFramework。
- 将 Experimental `PocketRootIshRuntime` 升级到 IshEmbed release revision
Expand Down
10 changes: 7 additions & 3 deletions Compliance/Release/experimental-v0.1.0/COMPOSITION.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@
"Package.swift": "3c53631753e44d6de1d0cd04cb1c725a105e65b2ba332ec19465c34048d5f339",
"Examples/PocketRootDemo/project.yml": "749cfea0c9a9e7cc4919d3dbee1c01720aa85d8f1b5fe4fc887b61d3a2d0f3fa",
"Examples/PocketRootHostApp/project.yml": "5d2961cd344b85b5ca0102f3e7b80c3bba7ac8681b645e3d8efae0ec137d33e4",
"Examples/PocketRootQuickStartApp/project.yml": "7fccc3adea4ece71959dee0c54fb1d83a3fc1e49d7f9f13c881c440dd0cf7fdf",
"Examples/PocketRootQuickStartApp/project.yml": "11c6f86f3be0f419a9a6f10dc884b4df9cb157bcdccb5568fe903972a6084416",
"Scripts/inject-demo-rootfs.sh": "3982b5382b0d1e13e0c8e8a5bb5404c5bad1dfc4d6e9cd23a39e3395a83087bb",
"Scripts/run-host-app-ui-smoke.sh": "557baabe9721bc65c484c299356176dc8c5300594c533f61245fd620c60f741b",
"Scripts/run-host-app-ui-smoke.sh": "811c58bd540512d35247970b994c54b28212145228fb40011c04456216052733",
"Scripts/run-ios-example-ui-smoke.sh": "d401c53b2bfb731713a9d3a894c306ce0f406e02810b49bf4a6ddd9c0a280f23",
"Scripts/run-quick-start-ui-smoke.sh": "acf26d68fc37250e24911c2d23791a0d12ff06a624dedcefee0ed7905bc31af2",
"Scripts/run-host-app-device-ui-smoke.sh": "f9528bd72aa40e6615633d1bc56ea8a31965b41f6570a0dc9f5fa390c5082490",
"ThirdPartyNotices/SwiftTerm-LICENSE.txt": "1c34c11581e20feb2b7ea122146a6690261dae94b2c8444e8cff902e567df6ae",
"Sources/CPocketRootArchiveSupport/CPocketRootArchiveSupport.c": "0abfdca5894c5e888de4ba48a73880dbbe2a593785c509684b52bfa412249751",
Expand Down Expand Up @@ -108,8 +110,10 @@
"Examples/PocketRootDemo/Sources/PocketRootDemo/Shared/UI/PlaceholderViewController.swift": "48e0f6462228a66face2aef51f9bd39ec02923c4d1c01b6b34f920948998f2b8",
"Examples/PocketRootHostApp/Sources/HostApp.swift": "0c36bd3104ddc5bebb9e23675a44a92e3ce4aec2c1461b3e182d86d1a75159c9",
"Examples/PocketRootHostApp/Sources/Info.plist": "711b38923f11fdb4ceb7d28cb90a51674afec0a64786a20f9bd68e3f406f8d26",
"Examples/PocketRootHostApp/UITests/PocketRootHostAppUITests.swift": "f8435d5c0a006e35b95804b49b485a05e0034265bb5ed0fd8e55458b8faaead6",
"Examples/PocketRootQuickStartApp/Sources/Info.plist": "b3c0c96e89db99c72c9f020590b1c5cdc0c927fd3af4b6ae7865abfdc81049b8",
"Examples/PocketRootQuickStartApp/Sources/QuickStartApp.swift": "25ca44394da42e62d93b563aad932c63452c4b65d478a0847d01635ff2cc6439",
"Examples/PocketRootQuickStartApp/Sources/QuickStartApp.swift": "1c77c9229281d0d1f9fbe3678bcc9995fff8c7d2189f4c6152daaa2999683fb6",
"Examples/PocketRootQuickStartApp/UITests/PocketRootQuickStartAppUITests.swift": "17db21ce0e23489ea85b19cef285746f33e1b6f8f6efedda0599d1934a8766ba",
"Spikes/PocketRootIshRuntimeCompileSpike/PocketRootIshRuntimeCompileSpike.swift": "829a9ef79d67cb93aae5fbea32561c5c5497a7a017922bb1ebb344b4c0c32da8",
"Spikes/PocketRootIshRuntimeSmoke/PocketRootIshRuntimeSmoke.swift": "e5a903fbb2f2994c45c5d57cf8df840263b5dd3a0716d8b9bbf0ad9018785af2",
"Compliance/RootFS/v0.3.3/EVIDENCE.json": "98170847e01c3c738d600970ca479202e7f69bf9f3b2cef31138462d0bfc3deb",
Expand Down
2 changes: 1 addition & 1 deletion Compliance/Release/experimental-v0.1.0/SBOM.spdx.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "PocketRoot experimental full-graph composition 0.1.0",
"documentNamespace": "https://github.com/jacklv-coder/PocketRoot/sbom/release/experimental-v0.1.0/57e45cba6a78cfce59ca4a14e50582ae9a8c722502de500f173678b36c954906",
"documentNamespace": "https://github.com/jacklv-coder/PocketRoot/sbom/release/experimental-v0.1.0/867d814a9b9144d98b849ec3feff767821a9c3b0cfc3131080fe14a163ba213d",
"creationInfo": {
"created": "2026-07-28T00:00:00Z",
"creators": [
Expand Down
4 changes: 2 additions & 2 deletions Compliance/Release/experimental-v0.1.0/SHA256SUMS
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
57e45cba6a78cfce59ca4a14e50582ae9a8c722502de500f173678b36c954906 COMPOSITION.json
867d814a9b9144d98b849ec3feff767821a9c3b0cfc3131080fe14a163ba213d COMPOSITION.json
1864fd0585b0eff50cc088d7323b5f38df958739e6ca79aba23d8e189b2fbf1c README.md
c5a965742cf96ae1840e7c703d794d5ba27caa71f40ea37ca85d94f652cd3cf4 SBOM.spdx.json
1dc3c97ef35d4beff2744b0ed8e7558fdeb526281c182d0c58bf792c167ea9ae SBOM.spdx.json
16 changes: 11 additions & 5 deletions Docs/Testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ PocketRoot 把验证分成宿主逻辑、真实 RootFS、iOS 构建、完整原
| 工程 App/archive 扫描 | `ruby Scripts/scan-release-artifact.rb` | macOS + 外部 `.app`/`.xcarchive` | 确定性文件摘要、Mach-O、签名/entitlement 风险信号与文件级 SPDX | 最终导出制品、依赖许可证完备性或分发授权 |
| development-signed archive 门禁 | `./Scripts/build-signed-engineering-archive.sh` | macOS + Xcode 账号/开发签名 | 标准 `.xcarchive`、development entitlement、clean 风险信号、复验与 SPDX schema | IPA/export、发行签名、安装、上传或分发授权 |
| Simulator 原生 smoke | `./Scripts/run-runtime-smoke.sh` | Apple Silicon + iOS 18 Simulator + archive | prepare、boot、命令边界和 soft shutdown 返回 | 其他工具链、真机或发行可用 |
| Quick Start UI smoke | `./Scripts/run-quick-start-ui-smoke.sh` | Apple Silicon + iOS 18 Simulator + archive | 最小业务 App 的 Files/Terminal 两个入口可从冷启动自动 boot,真实 PTY 创建的文件可由 Files 预览 | 真机、完整 Host 生命周期或发行可用 |
| Host App UI smoke | `./Scripts/run-host-app-ui-smoke.sh` | Apple Silicon + iOS 18 Simulator + archive | iPhone/iPad Simulator 上的公开宿主 Boot、SwiftTerm PTY、生命周期、Workspace 会话持续性、Files 增删改/预览、系统 document picker 导入、share sheet 保存与再次导入 round-trip,以及有序 shutdown | 真机系统文件交互、真机键盘、iPad 真机或发行可用 |
| Host App 真机 UI smoke | `./Scripts/run-host-app-device-ui-smoke.sh` | 支持设备 OS 的 Xcode + development-signed iPhone/iPad + archive | 同一 Host App 生命周期 UI 测试的真机执行、签名与 development entitlement | iPad、真实压力或发行可用 |
| 物理设备原生 smoke | `./Scripts/run-runtime-device-smoke.sh` | 签名 iOS 18+ iPhone/iPad + archive | 同一 17 项检查、可选进程暂停/恢复、UIKit 前后台、强制重启持久化、受限存储故障或有界内存警告恢复,development entitlement 与 shutdown 返回 | 真实 storage/memory pressure、断电、jetsam、iPad 或发行可用 |
Expand Down Expand Up @@ -511,13 +512,17 @@ RootFS。这只是兼容性证据,不授权 RootFS 分发,也不改变正式

最低工具链 job 另外固定选择 Xcode 16.0 / iOS 18.0 SDK,验证真实 RootFS install、
安装 iOS 18.0 Simulator runtime、完成 Simulator/device final-link,执行 17 项原生
smoke,并分别在 iPhone 16 与 iPad(第 10 代)Simulator 运行 Host App 的 PTY、
Files、Workspace,以及系统 document picker 导入、share sheet 保存、guest 删除后
再次导入并复验内容的 UI 闭环。测试 fixture 只在显式 `-PocketRootUITesting`
smoke,并分别在 iPhone 16 与 iPad(第 10 代)Simulator 运行最小 Quick Start 的
Files/Terminal 冷启动与 PTY-to-Files 文件闭环,以及 Host App 的 PTY、Files、
Workspace、系统 document picker 导入、share sheet 保存、guest 删除后再次导入并
复验内容的完整 UI 闭环。测试 fixture 只在显式 `-PocketRootUITesting`
启动参数下写入独立 Host App 示例的 Documents,不依赖用户 iCloud 或 Files 数据。可用
`POCKETROOT_HOST_UI_DEVICE_TYPE` / `POCKETROOT_HOST_UI_DEVICE_NAME` 选择 runner
创建的 Simulator;失败诊断时设置 `POCKETROOT_KEEP_UI_RESULT=1` 可保留临时
DerivedData 与 `.xcresult`。这些 Simulator 结果不证明签名真机或发行可用。
创建的 Host Simulator,或使用 `POCKETROOT_QUICK_START_UI_DEVICE_TYPE` /
`POCKETROOT_QUICK_START_UI_DEVICE_NAME` 选择 Quick Start Simulator;失败诊断时设置
`POCKETROOT_KEEP_UI_RESULT=1` 可保留临时 DerivedData 与 `.xcresult`。两个 wrapper
复用 `run-ios-example-ui-smoke.sh` 的相同 RootFS、超时、xcresult 和安全清理边界。
这些 Simulator 结果不证明签名真机或发行可用。

## 9. 改动与最小验证矩阵

Expand All @@ -530,6 +535,7 @@ DerivedData 与 `.xcresult`。这些 Simulator 结果不证明签名真机或发
| Package.swift 或 native dependency | `swift test` + Demo build + 两个 arm64 final-link + native smoke |
| `Examples/PocketRootDemo/project.yml` 或 Demo | regenerate + Demo build |
| smoke App/runner | shell syntax + Simulator smoke + 可用时 signed device smoke |
| Quick Start 入口或示例 | strict iOS build + iPhone/iPad Quick Start UI smoke |
| terminal/file browser | terminal tests(含二进制 stdin、原子导入、导出上限)+ strict iOS build + Demo build |
| PTY/SwiftTerm | session/runtime unit + final-link + Host App UI smoke + signed iPhone/iPad lifecycle |
| 文档 | `./Scripts/check-docs.sh` |
Expand Down
14 changes: 10 additions & 4 deletions Docs/en/Testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ PocketRoot separates host logic, real RootFS, iOS build, native final-link, and
| Engineering App/archive scan | `ruby Scripts/scan-release-artifact.rb` | Deterministic external `.app`/`.xcarchive` file hashes, Mach-O, signature/entitlement risk signals, and file-level SPDX | Final exported artifact, dependency-license completeness, or distribution authorization |
| Development-signed archive gate | `./Scripts/build-signed-engineering-archive.sh` | Standard `.xcarchive`, development entitlements, clean risk signals, deterministic re-verification, and SPDX schema validation | IPA export, release signing, installation, upload, or distribution authorization |
| Simulator native smoke | `./Scripts/run-runtime-smoke.sh` | Prepare, boot, command bounds, returning soft shutdown | Other toolchains, physical devices, distribution |
| Quick Start UI smoke | `./Scripts/run-quick-start-ui-smoke.sh` | Cold Files and Terminal entries in the minimal consumer App auto-boot; a real PTY-created file is previewed through Files | Physical devices, full Host lifecycle, distribution |
| Host App UI smoke | `./Scripts/run-host-app-ui-smoke.sh` | Public-host boot, SwiftTerm PTY, lifecycle, Workspace persistence, Files mutations/previews, system document-picker import, share-sheet save and re-import round trip, and ordered shutdown on iPhone/iPad iOS 18 Simulators | Physical-device system file interaction, physical keyboards, physical iPad, distribution |
| Physical Host App UI smoke | `./Scripts/run-host-app-device-ui-smoke.sh` | The same lifecycle UI test on a development-signed iPhone/iPad, including signature and development entitlements | iPad, real pressure, distribution |
| Physical native smoke | `./Scripts/run-runtime-device-smoke.sh` | Same 17 checks with optional process suspend/resume, UIKit lifecycle, forced-relaunch persistence, bounded storage-failure recovery, or bounded memory-warning recovery; development entitlements and returning soft shutdown | Real storage/memory pressure, power cut, jetsam, iPad, distribution |
Expand Down Expand Up @@ -435,17 +436,21 @@ uploads neither the App nor scan evidence.
The minimum-toolchain job explicitly selects Xcode 16.0 / iOS 18.0 SDK,
validates real RootFS installation, installs the iOS 18.0 Simulator runtime,
final-links Simulator/device Apps, runs the 17-check native smoke, and executes
the Host App PTY, Files, Workspace, and system document-picker import,
the minimal Quick Start cold Files/Terminal and PTY-to-Files file closure plus
the full Host App PTY, Files, Workspace, system document-picker import,
share-sheet save, guest deletion, re-import, and content-verification UI
closure on iPhone 16 and iPad (10th generation) Simulators. The fixture is
written to the standalone Host App example's Documents only under the explicit
`-PocketRootUITesting` launch argument, without relying on user iCloud or Files
data. Set
`POCKETROOT_HOST_UI_DEVICE_TYPE` and
`POCKETROOT_HOST_UI_DEVICE_NAME` to select the Simulator created by the runner.
For failure diagnosis, `POCKETROOT_KEEP_UI_RESULT=1` retains temporary
DerivedData and the `.xcresult`. This Simulator evidence does not prove
signed-device or distribution readiness.
Use `POCKETROOT_QUICK_START_UI_DEVICE_TYPE` and
`POCKETROOT_QUICK_START_UI_DEVICE_NAME` for Quick Start. Both wrappers share
`run-ios-example-ui-smoke.sh` for the same RootFS, timeouts, xcresult, and safe
cleanup boundaries. For failure diagnosis, `POCKETROOT_KEEP_UI_RESULT=1`
retains temporary DerivedData and the `.xcresult`. This Simulator evidence
does not prove signed-device or distribution readiness.

## Minimum checks by change

Expand All @@ -458,6 +463,7 @@ signed-device or distribution readiness.
| Package/native dependency | Package + Demo + both final links + smoke |
| `Examples/PocketRootDemo/project.yml` or Demo | Regenerate + Demo build |
| smoke | Shell syntax + Simulator smoke + signed-device smoke when available |
| Quick Start entry/example | Strict iOS build + iPhone/iPad Quick Start UI smoke |
| terminal/files UI | Terminal tests + strict iOS build + Host App UI smoke |
| docs | Documentation check |
| release composition/compliance evidence | Generator tests + `--check` + pinned SPDX schema validation |
Expand Down
Loading