Appearance
passno 开发计划
设计见 docs/design.md。每完成一项就更新这里的状态。
需要你本人在场 / 你来决定(优先处理)
| # | 事项 | 什么时候需要 | 状态 |
|---|---|---|---|
| 1 | — | 已定 | |
| 2 | — | 已定 | |
| 3 | 测试样本:2026-11-16 已改用合成样本,见 tests/fixtures/import/,由 tools/fixtures/gen_import_fixtures.py 生成,开发先用这些。以后可选:从 1Password 8 的测试库导出真实 .1pux、从 Apple 密码 App 导出 CSV,放在 ~/passno-samples/(不进仓库),用来核对 fixtures README 里列出的"没跟真实导出核对过"的几点 | 导入器做完后 | 合成样本已有,真实核对可选 |
| 4 | QKPMA8N9LJ。登录方法见 ~/code/github/infra/network/cloud-accounts.md。本机钥匙串里已有 Developer ID Application: Feng Chen (QKPMA8N9LJ) 和 Apple Development 证书。开发时还要配几样东西:App ID、keychain-access-groups、App Group,以后的 AutoFill 扩展还要 autofill-credential-provider 权限。agent 可以用 Xcode 自动签名,或经 agent-browser 登录开发者网站配置;钥匙串弹出"允许"框时才需要你在场 | 阶段 2(Touch ID)前 | 账号已有,配置待做 |
| 5 | 浏览器商店开发者账号:Chrome Web Store、Firefox AMO、Edge。开发阶段可以加载未打包的扩展,不急 | 发布前 | 待做 |
| 6 | Windows 代码签名证书。做 MSIX 和通行密钥插件时要 | 阶段 8(Windows) | 待做 |
| 7 | 主观验收:管理界面、扩展弹窗、审批弹窗、iOS App 和自动填充好不好用 | 阶段 3、4、5、6 结束时 | — |
| 8 | 真机测试(书房 iPhone 12 Pro):只在模拟器测不了时才用,比如 Face ID 真机行为、其他 App 里的自动填充。每次启动 UI 自动化都要在手机上输锁屏密码,所以要你在场 | 阶段 6,按需 | 按需 |
平台顺序与测试环境(2026-11-16 定)
- 先做 macOS 和 iOS,都在本机测。 iOS 默认用模拟器。
- 下一步做 Windows,在本机的 Win11 虚拟机上测。
- Linux 和 Android 往后放。
核心库的单元测试从一开始就在 CI 里同时跑 macOS 和 Linux,成本低,能防止写出只能在 Mac 上编译的代码。Windows CI 到阶段 8 再加。
| 平台 | 怎么测 |
|---|---|
| macOS App(Tauri) | 本机运行。界面自动化用 agent-desktop skill(读无障碍树),逐步读屏、判断、操作、读回核对 |
| 浏览器扩展 | 自动化测试用 Playwright 自带的 Chromium,加载未打包的扩展,用临时 profile 和本地靶场页面。绝不把开发中的扩展装进共享的前台 Chrome,那里有用户真实的登录状态。Safari 扩展在本机 Safari 里测 |
| iOS | 模拟器 sim:iPhone 17 Pro,只用 agent-device,经 phone 命令(skill ios-testing)。每一步:读屏 → 判断 → 一个操作 → 读回核对;每次等待不超过 10 秒;不写写死流程的 UI 测试脚本 |
| iOS 系统自动填充 | 在模拟器里:设置 → 通用 → 自动填充与密码,打开 passno,然后在 Safari 里打开本地靶场页面验证。Face ID 用模拟器的"已录入 / 匹配面容"来模拟 |
| Windows | Win11 ARM64 虚拟机(ssh host win11),桌面和 glass 项目共用。照 ~/code/github/glass/tools/windows-e2e/vm-run.sh 的做法:在 Mac 上用 cargo xwin 交叉编译、复制到虚拟机、在桌面会话里跑。必须先拿虚拟机锁(C:\glass-dev\vm.lock,和 glass 共用),只动 passno 自己的文件和进程 |
里程碑 v0.1:第一个可用版本(目标 2026-11-16 白天交付)
用户要求先交付一个能用的版本,再迭代。v0.1 只在 macOS 上做,范围如下:
| 工作线 | 内容 | 分支 |
|---|---|---|
| core | Cargo workspace、许可证;passno-model、passno-crypto、passno-vault(本地目录、单用户、操作日志 + 快照、主密码 + Secret Key 解锁);pn CLI(init / unlock / add / edit / list / search / show / gen / totp / import / doctor / agent-help),按 design.md 第 12.2 节做到对 agent 友好 | feat/core |
| gen | passno-gen(随机字符、口令短语、PMR 网站规则、熵值)、passno-totp、passno-match(PSL / eTLD+1) | feat/gen |
| desktop | Tauri v2 + React + Tailwind 的 macOS App,按 docs/ui/style.md 做:首次设置(主密码 + Secret Key + 应急套件)、解锁、条目列表 / 搜索 / 详情、新建 / 编辑、生成器弹窗、导入向导、锁定。先用模拟数据,再接到核心 | feat/desktop |
| import | passno-import:1pux、Apple CSV、1Password CSV,加迁移报告;用 tests/fixtures/import/ 断言 | feat/import |
v0.1 不做(留给 v0.2 以后):后台进程 passnod、Touch ID、浏览器扩展、agent 授权和 MCP、同步、共享、iOS、Windows。
v0.1 的安全底线:
- CLI 和 App 在进程内直接调用核心库。
- 明文只在本人操作时显示:
pn show --reveal只在交互式终端里生效,非终端环境一律拒绝,并提示"agent 访问在 v0.2 提供"。
分工方式: 每条工作线由一个 agy 在独立的 git worktree(../passno-wt/<名字>)里做,提交到自己的分支。协调者(Claude)负责审查、跑测试、合并到 main,并更新本表的状态。
阶段
阶段 0:仓库骨架
- Cargo workspace,所有 crate 先建空壳。
- CI:fmt / clippy / test,macOS 和 Linux 都跑。
- 加 LICENSE-APACHE、LICENSE-MIT、README、
docs/threat-model.md。
阶段 1:核心库 + CLI(单用户、本地目录)
passno-model、passno-crypto(Argon2id、HKDF、XChaCha20-Poly1305、Ed25519、X25519/HPKE)。passno-vault:- 操作日志、快照、HLC 合并。
- 纪元和成员日志的格式现在就定好,先只有一个成员。
passno-gen、passno-totp、passno-match。PMR 数据收进仓库,用脚本更新。passno-import:OnePux、OnePasswordCsv、AppleCsv,并给出迁移报告。用tests/fixtures/import/里的样本,按manifest.json断言。pnCLI:init / unlock / add / edit / list / search / gen / totp / import / doctor。- 从第一天起就按 design.md 第 12.2 节做:三层帮助(
--help、子命令帮助、help --json)、pn agent-help、全部支持--json、固定退出码、三段式错误信息、不是终端时不交互。 - 测试:在非 TTY 环境下把每条命令都跑一遍,确认没有一条会卡住等输入;用快照测试固定
help --json的输出。
- 从第一天起就按 design.md 第 12.2 节做:三层帮助(
- 测试:加解密往返、篡改检测、合并、各导入器的映射;用 proptest 测解析器。
- 核心 crate 不依赖任何平台 API,以后 iOS 经 UniFFI 直接调用。
阶段 2:后台进程 passnod(macOS)
- IPC:Unix socket(0700 目录),
PeerVerifier的 macOS 实现(audit token + 代码签名校验,TeamQKPMA8N9LJ)。 Unlocker:- Password 实现。
- macOS 安全飞地实现:Touch ID 或 Apple Watch。
- 按 design.md 第 4 节的规则,在规定情况下强制输主密码。
SecretKeyStore的 macOS / iOS 实现:iCloud 钥匙串(可同步)。另有应急套件的导出和导入。- 自动锁定:空闲、睡眠或锁屏、最长会话时长。内存方面:zeroize、锁内存、防调试、关 core dump。
- CLI 改成连后台进程。
- trait 和协议照跨平台来设计;Windows 和 Linux 的实现留到阶段 8、9。
阶段 3:macOS 管理 App(Tauri v2)
- 界面严格按
docs/ui/style.md来做:条目管理、生成器、导入向导、安全检查、设置。 - 审批弹窗:给阶段 5 用。
- 菜单栏图标:锁定、一键撤销全部授权。
- 签名和公证:用 Developer ID。
- App 自带 CLI: 安装包里带
pn、passnod、passno-nmhost;第一次启动时安装/usr/local/bin/pn软链,用户拒绝就退回~/.local/bin;passnod用 SMAppService 注册成登录项。详见 design.md 第 12.1 节。- 验收:从全新安装开始,新开一个终端直接运行
pn doctor,结果全部正常;App 升级后pn --version跟着变。
- 验收:从全新安装开始,新开一个终端直接运行
pn agent install-skill:给 Claude Code 和 Codex 安装使用说明。- 完成后要做主观验收(需要人做的第 7 项)。
阶段 4:浏览器扩展(macOS 上的 Chrome,然后是 Safari)
passno-nmhost,加上 macOS 上各浏览器的宿主清单安装程序。- 扩展和后台进程的配对协议。
- 扩展(MV3 / TypeScript):
- 表单识别。
- 页面内菜单(防点击劫持)。
- 填充用户名、密码和 TOTP。
- 提交后提示保存或更新。
- 注册和改密码表单旁给生成的密码。
- HTTP Basic 认证。
- Safari 扩展:放在 macOS App 里打包,消息经 App 扩展转给后台进程。
- 测试:本地靶场页面,覆盖各种表单、iframe、点击劫持场景;用 Playwright 自带的 Chromium 跑,Safari 部分手动加 agent-desktop 跑。
阶段 5:agent 访问(macOS)
pn agent enroll、授权引擎(绑定精确命令或接口)、哈希链审计日志。pn run、本地 HTTP 注入代理、ssh-agent、经扩展代填网页。pn mcp:只返回授权编号和执行结果。- 用 Claude Code 和 Codex 在本机实际跑一遍。
阶段 6:iOS App + 系统自动填充 + iCloud 同步
- 先做技术验证(spike): 用 Tauri v2 的 iOS 支持复用桌面端的 React 界面,同时把 Swift 写的 AutoFill 扩展(
.appex)嵌进 Tauri 生成的 Xcode 工程,还要验证签名能过。验证不通过,就把 iOS 主 App 改用 SwiftUI。两种方案的界面都按docs/ui/style.md做。macOS 上把 AutoFill 扩展嵌进 Tauri App 用的是同一套办法,一起验证。 - iOS 上没有后台进程,核心库经 UniFFI 在进程内运行。主 App 和 AutoFill 扩展通过 App Group 共用保险库目录和缓存。
- AutoFill provider(iOS 和 macOS 都要):
- 填密码和 TOTP。
- 通行密钥的创建和使用。
- 保存时调用生成器。
- CXF 导入: 用
ASCredentialImportManager从 Apple 密码导入,包括通行密钥。映射逻辑在 Rust 核心里。 - 同步: 实现
SyncTransport的 Folder 版本,iCloud Drive 是首选。Mac 和 iPhone 之间用 iCloud 钥匙串同步 Secret Key,用 iCloud Drive 同步保险库。 - 测试: 全部在
sim:iPhone 17 Pro上做,用phone;真机只在必要时用(需要人做的第 8 项)。
阶段 7:家庭共享 + 更多同步方式(仍属于 v1)
- 共享:
- 邀请、核对指纹或扫二维码、角色。
- 移除成员时换纪元,并提示轮换密码。
- 防回滚告警。
SyncTransport再加 Git、Syncthing、Dropbox 的目录实现。- 加设备:扫二维码或输入 Secret Key。
- 测试:模拟多设备并发写、回滚、伪造签名、移除成员。还要用两个模拟器加本机 Mac 实际跑一遍。
阶段 8:Windows(Win11 虚拟机)
- 命名管道 IPC,
PeerVerifier的 Windows 实现(客户端 PID + Authenticode)。 Unlocker的 Windows Hello 实现,SecretKeyStore的 Windows 实现。- 写 passno 自己的
tools/windows-e2e/(照 glass 的 vm-run.sh 做,共用虚拟机锁)。 - Tauri 的 Windows 构建、MSIX、代码签名(需要人做的第 6 项)。
- 浏览器扩展:native messaging 宿主写注册表。
- 通行密钥插件(Windows 11 插件 API)。
- CI 加上 Windows。
阶段 9:以后
- Linux(Polkit 解锁、
SO_PEERCRED、Secret Service)。 - Android。
- 手机推送审批。
- Firefox 和 Edge 的商店上架。