完成40%
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
# 家谱 App Product Design 视觉精修实施计划
|
||||
|
||||
> 现行范围更新:A03 已于 2026-07-14 删除;验证码登录归 A02,绑定手机号归个人中心,微信异常归 A06。历史方案不再作为实现依据。
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. Do not use parallel agents in this shared workspace.
|
||||
|
||||
**Goal:** 在不改变已验收 A01、G01 可见效果和既有业务交互的前提下,把其余 57 个页面从“可浏览的第一版”精修为同一套、可在 Android 小屏上成立的家祠卷轴界面。
|
||||
@@ -168,25 +170,24 @@
|
||||
|
||||
只在用户确认 A02 后,将 `docs/规划.md` 状态更新为“认证样板已验收”。用户未确认时,记录为“实现完成,视觉待验收”,不得假称完成。
|
||||
|
||||
## Task 4: 完成认证模块 A03–A06
|
||||
## Task 4: 完成认证模块 A04–A06
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/a03-mobile-verify.vue`
|
||||
- Modify: `pages/auth/a04-register.vue`
|
||||
- Modify: `pages/auth/a05-reset-password.vue`
|
||||
- Modify: `pages/auth/a06-auth-status.vue`
|
||||
- Create only after A02 布局被两页复用: `components/auth/AuthFormPanel.vue`
|
||||
- Modify: `data/page-catalog.js` and `components/ModulePage.vue` only when the corresponding A03–A06 entry is removed from the temporary motherplate
|
||||
- Modify: `data/page-catalog.js` and `components/ModulePage.vue` only when the corresponding A04–A06 entry is removed from the temporary motherplate
|
||||
- Modify: `tests/full-page-visual-contract.ps1`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
**Consumes:** 已验收的 A02 面板、按钮和文字层级。
|
||||
|
||||
**Produces:** 认证六页同一入口体验:登录、验证码、注册、重设和结果状态各有对应任务,不能仍显示泛化的“功能完善中”。
|
||||
**Produces:** 认证五页同一入口体验:登录、注册、重设和结果状态各有对应任务,不能仍显示泛化的“功能完善中”。
|
||||
|
||||
- [ ] **Step 1: 分别写四条红灯合同。**
|
||||
|
||||
A03 必须有手机号与验证码;A04 有手机号、密码、确认密码和协议提示;A05 有手机号、验证码、新密码;A06 有状态图标、说明和明确返回登录操作。合同只验证存在的交互和资产锚点,不宣称后端已接入。
|
||||
A04 有手机号、密码、确认密码和协议提示;A05 有手机号、验证码、新密码;A06 有状态图标、说明和明确返回登录操作,并承接微信授权取消、失败与受限。合同只验证存在的交互和资产锚点,不宣称后端已接入。
|
||||
|
||||
- [ ] **Step 2: 用 A02 的已确认结构分别实现。**
|
||||
|
||||
@@ -194,7 +195,7 @@
|
||||
|
||||
- [ ] **Step 3: 模块截图与回归。**
|
||||
|
||||
对 A03、A04、A05、A06 至少各保存 360×800 一张截图;运行认证合同、`compile-audit.ps1`、`git diff --check`。A01 不改动且至少复核 412×915。
|
||||
对 A04、A05、A06 至少各保存 360×800 一张截图;运行认证合同、`compile-audit.ps1`、`git diff --check`。A01 不改动且至少复核 412×915。
|
||||
|
||||
## Task 5: 完成家谱模块 G02–G12
|
||||
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# A02 协议确认控件实施计划
|
||||
|
||||
> 现行范围更新:A03 已于 2026-07-14 删除;验证码登录归 A02,绑定手机号归个人中心,微信异常归 A06。历史方案不再作为实现依据。
|
||||
|
||||
> **For agentic workers:** 本计划由当前根代理内联执行;用户明确禁止 worktree、子代理、Git 暂存、提交、推送与上传。步骤以复选框追踪。
|
||||
|
||||
**Goal:** 在不改变 A01 可见效果的前提下,让 A02 在当前页提供可见、可操作的协议确认并以其状态拦截登录提交。
|
||||
|
||||
**Architecture:** A02 页面本地 `agreed` 状态是提交前协议状态的唯一所有者,A01 的 `agreed=1` 只用于初始化。两个 96 × 96 的透明 PNG 负责未选中和选中图标,Vue 负责可点击行、文字、链接与状态切换;不新增协议正文路由。
|
||||
|
||||
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 契约审计、ImageGen、Chrome DevTools 截图。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- A01、G01 可见效果冻结;本轮不触碰 A01。
|
||||
- 完整视觉图标使用真实透明 PNG;不以 CSS 圆环、勾号、伪元素或文本符号替代。
|
||||
- 先写并运行失败的最小契约,再生成资产或修改页面。
|
||||
- 不修改 A04--A06,不新增业务接口、协议路由、依赖或 Git 操作。
|
||||
- A02 已获用户视觉验收,保持可见效果冻结。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 固化 A02 协议与资产合同
|
||||
|
||||
**Files:**
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1`
|
||||
- Modify: `tests/a02-asset-alpha-audit.ps1`
|
||||
|
||||
- [x] **Step 1: 写失败的 UI 合同。**
|
||||
|
||||
加入以下锚点:`agreement-row`、`agreement-icon`、两枚 A02 协议图标路径、`const agreed = ref(false)`、`onLoad/onShow`、H5 `location.hash` 与 Android 页面选项的路由同步、`toggleAgreement`、`请先阅读并同意相关协议`。拒绝旧提示 `请先在登录引导页阅读并确认协议` 与 A02 协议图标的 CSS `border`、`background`、伪元素。
|
||||
|
||||
- [x] **Step 2: 运行 UI 合同并确认红灯。**
|
||||
|
||||
运行:`powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1`
|
||||
|
||||
预期:因 A02 尚无协议行和图标锚点而失败。
|
||||
|
||||
- [x] **Step 3: 写失败的资产审计。**
|
||||
|
||||
令 `tests/a02-asset-alpha-audit.ps1` 对两枚 `static/assets/modules/auth/transparent/a02-agreement-*.png` 逐个验证:存在、96 × 96、`System.Drawing.Image.IsAlphaPixelFormat` 为真、四角 Alpha 为 0,且至少一个像素 Alpha 为 255。
|
||||
|
||||
- [x] **Step 4: 运行资产审计并确认红灯。**
|
||||
|
||||
运行:`powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1`
|
||||
|
||||
预期:因两枚协议图标尚不存在而失败。
|
||||
|
||||
### Task 2: 生成并接入透明协议状态资产
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/modules/auth/transparent/a02-agreement-unchecked.png`
|
||||
- Create: `static/assets/modules/auth/transparent/a02-agreement-checked.png`
|
||||
- Modify: `pages/auth/a02-login.vue`
|
||||
|
||||
- [x] **Step 1: 生成未选中与选中图标。**
|
||||
|
||||
用 ImageGen 参考 A02 运行截图生成两枚不含文字的圆形古金协议图标:未选中为细古金圆环,选中为朱砂圆印内白色对勾。先用平坦色键背景生成,再移除为透明 PNG;不得保留背景、阴影、边框或水印。
|
||||
|
||||
- [x] **Step 2: 仅在资产审计通过后实施 A02。**
|
||||
|
||||
模板将旧 `agreement-reminder` 换为可点击 `agreement-row`,内部按 `agreed` 切换两枚 `agreement-icon` 图片;协议文字链接调用 `prepareAgreement` 并停止行点击。脚本以 `agreed` 替代 `agreedFromEntry`,并在 `onLoad/onShow` 同步 H5 当前 hash 或 Android 当前页面选项;`canSubmit` 只判断本页状态。样式只做行尺寸、排版与状态可见性,不画图标。
|
||||
|
||||
- [x] **Step 3: 运行绿灯合同。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
```
|
||||
|
||||
预期:两个脚本均输出 `PASS`。
|
||||
|
||||
### Task 3: 记录并做运行验证
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Modify: `docs/design/A02_账号登录_设计记录.md`
|
||||
- Modify: `design-qa.md`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-unchecked-320x568.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-unchecked-360x640.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-unchecked-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-unchecked-412x915.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-checked-360x800.png`
|
||||
|
||||
- [x] **Step 1: 更新事实台账。**
|
||||
|
||||
在 P00 登记两枚图标的路径、96 × 96 尺寸、transparent 属性、A02 引用位置与保留状态;设计记录和 QA 仅写本轮交互与运行截图,最终状态保持 `blocked`。
|
||||
|
||||
- [x] **Step 2: 截取并检查两种状态。**
|
||||
|
||||
使用专用 Chrome 9222 捕获 A02 直接进入的 320×568、360×640、360×800、412×915 未选中状态,以及 `?agreed=1` 的 360×800 选中状态;逐张打开检查,不接受复用状态、黑块、加载态、裁切或错误图。后续补充的注册入口已在新文档 360×800、412×915 截图中复核。
|
||||
|
||||
- [x] **Step 3: 运行受影响验证。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-register-entry-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/capture-chrome-page-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
预期:所有脚本 PASS;`git diff --check` 没有真实空白错误。
|
||||
@@ -0,0 +1,70 @@
|
||||
# A04 注册页视觉平衡修订实施计划
|
||||
|
||||
> **For agentic workers:** 在当前工作区逐项执行;用户禁止子代理、worktree、Git 暂存、提交、推送与上传。
|
||||
|
||||
**Goal:** 修复 A04 窄屏中长标签与占位提示粘连、无目的引导文案挤压表单的问题,同时保持 A04 的注册行为和既有位图资产体系。
|
||||
|
||||
**Architecture:** 只改 `pages/auth/a04-register.vue` 的 A04 局部结构与布局。标题下采用现有透明位图 `auth-divider-knot.png` 作为分隔,移除 `register-intro`;输入标签列统一为 `154rpx`,使长标签与输入占位文字有稳定间距。所有面板、按钮、边框和装饰继续由既有位图提供。
|
||||
|
||||
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 源码契约、Chrome DevTools 截图。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 仅修改 A04 与它的契约、设计记录、运行时截图;不修改已验收 A01、A02、G01。
|
||||
- 不生成新资产;使用 `static/assets/foundation/transparent/auth-divider-knot.png`。
|
||||
- 先让契约失败,再写最小实现;完成前重跑契约、截图、回归与 `git diff --check`。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 固化并实现 A04 的窄屏信息层级
|
||||
|
||||
**Files:**
|
||||
- Modify: `tests/a04-registration-contract.ps1`
|
||||
- Modify: `pages/auth/a04-register.vue`
|
||||
- Modify: `docs/design/A04_注册账号_设计记录.md`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A04-after-balance-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A04-after-balance-412x915.png`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: 已有 `auth-divider-knot.png`、A04 的 `phone`、`password`、`confirmPassword`、`agreed` 与 `submitRegister`、`prepareLogin`。
|
||||
- Produces: 无 `register-intro` 的 A04;标题后有 `register-divider` 位图;`.input-label` 宽度为 `154rpx`;A04 原有注册和回流行为不变。
|
||||
|
||||
- [x] **Step 1: 写失败的视觉结构契约。**
|
||||
|
||||
在 `tests/a04-registration-contract.ps1` 追加断言:A04 不含 `register-intro`;模板引用 `auth-divider-knot.png` 并有 `register-divider`;样式含 `width: 154rpx`;既有 `register-submit`、`agreement-row`、`prepareLogin` 与 `/pages/auth/a02-login` 保持存在。
|
||||
|
||||
- [x] **Step 2: 运行红灯。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
|
||||
```
|
||||
|
||||
预期:因旧版仍含 `register-intro`、没有 `register-divider`、标签宽度仍为 `126rpx` 而失败。
|
||||
|
||||
- [x] **Step 3: 写最小实现。**
|
||||
|
||||
在标题后放入:
|
||||
|
||||
```vue
|
||||
<image class="register-divider" src="/static/assets/foundation/transparent/auth-divider-knot.png" mode="aspectFit" />
|
||||
```
|
||||
|
||||
删除 `register-intro`,添加 `.register-divider` 的尺寸定位规则,将 `.form-content` 顶距改为与分隔位图相连的间距,并把 `.input-label` 的 `width` 改为 `154rpx`。不改脚本、路由、注册校验或其他页面。
|
||||
|
||||
- [x] **Step 4: 运行绿灯与真实截图审视。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a04-register" ".auth-page" "docs/design/screens/runtime/2026-07-14/A04-after-balance-360x800.png" 360 800
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a04-register" ".auth-page" "docs/design/screens/runtime/2026-07-14/A04-after-balance-412x915.png" 412 915
|
||||
```
|
||||
|
||||
逐张检查长标签与占位文字的间距、标题到表单的层级、底部协议与登录入口、窄屏横向裁切与黑块。
|
||||
|
||||
- [x] **Step 5: 最终回归与记录。**
|
||||
|
||||
运行 A04 契约、A03 路由移除、A01/A02 契约、编译审计、全页视觉契约与 `git diff --check`;在 A04 设计记录中标注本轮平衡修订的截图和结论。
|
||||
@@ -0,0 +1,96 @@
|
||||
# A04 注册账号实施计划
|
||||
|
||||
> **For agentic workers:** 使用 `superpowers:executing-plans` 在当前工作区内联执行。用户禁止子代理、worktree、Git 暂存、提交、推送与上传。
|
||||
|
||||
**Goal:** 将 A04 从通用表单壳改为带协议确认、字段校验和 A02 回流的独立注册页。
|
||||
|
||||
**Architecture:** A04 自己拥有手机号、密码、确认密码和 `agreed` 状态;视觉只复用 A02 的完整卷轴面板、A01 主按钮、认证头与 A02 协议图标。A04 从 `pageCatalog` 临时母版移除,不改变已验收 A01/A02/G01。
|
||||
|
||||
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 契约审计、Chrome DevTools 截图。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 完整面板、按钮与协议图标必须引用已有位图资产,禁止 CSS 绘制最终表面。
|
||||
- 不使用 ImageGen;现有认证资产已满足本页完整视觉需要。
|
||||
- 不接入真实注册、短信、微信、协议正文或后端接口。
|
||||
- A01、A02、G01 可见效果冻结;不修改它们。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 固化独立注册页合同
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/a04-registration-contract.ps1`
|
||||
- Modify: `pages/auth/a04-register.vue`
|
||||
- Modify: `data/page-catalog.js`
|
||||
|
||||
- [x] **Step 1: 写失败的最小契约。**
|
||||
|
||||
创建 `tests/a04-registration-contract.ps1`,读取 A04、`pages.json`、`page-catalog.js`,并断言:A04 不引用 `ModulePage`;存在 `auth-header`、`register-panel__skin`、`a02-login-panel.png`、`a01-primary-button.png`、两枚 A02 协议图标、手机号/密码/确认密码模型、`agreed`、`toggleAgreement`、`submitRegister`、`prepareLogin` 与 A02 路由;拒绝 A04 面板、按钮、协议图标的 CSS `border`/`background` 伪造。
|
||||
|
||||
- [x] **Step 2: 运行红灯。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
|
||||
```
|
||||
|
||||
预期:因 A04 仍是 `ModulePage` 而失败。
|
||||
|
||||
- [x] **Step 3: 最小独立实现。**
|
||||
|
||||
重写 `pages/auth/a04-register.vue`:使用 A02 头、完整卷轴面板、三行真实输入、本页协议行、完整朱砂主按钮与“已有账号? 登录”入口。用 `phone`、`password`、`confirmPassword`、`agreed` 保存状态;`submitRegister` 依次校验协议、11 位手机号、密码、密码一致,再显示“注册服务待接入”。删除 `data/page-catalog.js` 的 `a04` 条目。
|
||||
|
||||
- [x] **Step 4: 运行绿灯。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
```
|
||||
|
||||
预期:输出 `A04-REGISTRATION-CONTRACT PASS` 与 `PASS compile audit`。
|
||||
|
||||
### Task 2: 记录并验证注册页
|
||||
|
||||
**Files:**
|
||||
- Create: `docs/design/A04_注册账号_设计记录.md`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A04-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A04-after-412x915.png`
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
|
||||
- [x] **Step 1: 写 A04 设计记录。**
|
||||
|
||||
记录 A04 的任务、复用资产、本页状态、无后端边界、A02 回流、截图与自动检查;初始状态为“实现与截图完成,等待用户视觉验收”。用户于 2026-07-14 验收后,规划与交接已同步为 A04 冻结,A05 可以开始。
|
||||
|
||||
- [x] **Step 2: 捕获并审视两张真实运行截图。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a04-register" ".auth-page" "docs/design/screens/runtime/2026-07-14/A04-after-360x800.png" 360 800
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a04-register" ".auth-page" "docs/design/screens/runtime/2026-07-14/A04-after-412x915.png" 412 915
|
||||
```
|
||||
|
||||
逐张打开检查:完整头、卷轴边框、三项输入、协议、按钮和登录入口可读;无横向裁切、黑块、加载态或 CSS 通用卡片。
|
||||
|
||||
- [x] **Step 3: 运行最终回归。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-register-entry-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/capture-chrome-page-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
实际:全部 PASS;用户已于 2026-07-14 确认 A04 通过视觉验收,后续从 A05 开始。
|
||||
@@ -0,0 +1,87 @@
|
||||
# A05 重置密码实施计划
|
||||
|
||||
> **For agentic workers:** 在当前工作区逐项执行;用户禁止子代理、worktree、Git 暂存、提交、推送与上传。
|
||||
|
||||
**Goal:** 将 A05 改为与已验收认证入口一致的独立手机验证重置密码页,并保留真实本地校验与 A02 回流。
|
||||
|
||||
**Architecture:** `pages/auth/a05-reset-password.vue` 自己拥有四项表单状态、验证码提示、重置校验和 A02 跳转,不再依赖 `ModulePage`。视觉复用 A02/A04 已用的完整认证位图,`data/page-catalog.js` 删除 `a05` 临时条目。
|
||||
|
||||
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 源码契约、Chrome DevTools 截图。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 仅修改 A05、它的契约、目录项、设计记录、规划/交接/资产台账与运行时截图。
|
||||
- 不生成新资产;完整卷轴面板、朱砂主按钮、页头、结饰和返回箭头全部引用已有位图。
|
||||
- 不修改已验收 A01、A02、A04、G01 的可见效果。
|
||||
- 先红灯后绿灯;完成前重跑受影响回归、截图审视和 `git diff --check`。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 固化独立 A05 重置密码合同
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/a05-reset-password-contract.ps1`
|
||||
- Modify: `pages/auth/a05-reset-password.vue`
|
||||
- Modify: `data/page-catalog.js`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `/pages/auth/a02-login`、`auth-header.png`、`a02-login-panel.png`、`a01-primary-button.png`、`auth-divider-knot.png` 与 `chevron-right.png`。
|
||||
- Produces: A05 的 `phone`、`verificationCode`、`password`、`confirmPassword`、`prepareGetCode`、`submitReset`、`prepareLogin` 和 `goBack`。
|
||||
|
||||
- [x] **Step 1: 写失败的最小契约。**
|
||||
|
||||
创建 PowerShell 测试,读取 A05、`pages.json`、`data/page-catalog.js` 并断言:A05 路由存在但不使用 `ModulePage`;模板拥有认证头、卷轴面板、主按钮、结饰、手机号/验证码/新密码/确认新密码的 `v-model`、获取验证码动作、重置校验、A02 登录回流;`a05:` 从临时目录移除;A05 面板、主按钮和验证码动作不以 CSS `border`/`background` 伪造完整表面。
|
||||
|
||||
- [x] **Step 2: 运行红灯。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1
|
||||
```
|
||||
|
||||
预期:A05 仍引用 `ModulePage` 且目录仍有 `a05:`,测试失败。
|
||||
|
||||
- [x] **Step 3: 最小独立实现。**
|
||||
|
||||
将 A05 写为独立认证页:认证背景与页头、带返回动作的标题、结饰、四行真实输入;验证码行右侧是无表面文字动作;完整位图主按钮;“返回登录”回流 A02。实现 `prepareGetCode`、`submitReset` 和四项顺序校验;删除 `data/page-catalog.js` 的 `a05` 条目。
|
||||
|
||||
- [x] **Step 4: 运行绿灯。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
```
|
||||
|
||||
预期:输出 `A05-RESET-PASSWORD-CONTRACT PASS` 与 `PASS compile audit`。
|
||||
|
||||
### Task 2: 记录、截图与最终回归
|
||||
|
||||
**Files:**
|
||||
- Create: `docs/design/A05_重置密码_设计记录.md`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A05-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A05-after-412x915.png`
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
- [x] **Step 1: 写设计记录。**
|
||||
|
||||
记录 A05 的四项认证流程、复用资产、未接入短信/后端的边界、A02 回流、截图与自动检查;状态写“实现与截图完成,等待用户视觉验收”。
|
||||
|
||||
- [x] **Step 2: 捕获并审视真实截图。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a05-reset-password" ".auth-page" "docs/design/screens/runtime/2026-07-14/A05-after-360x800.png" 360 800
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a05-reset-password" ".auth-page" "docs/design/screens/runtime/2026-07-14/A05-after-412x915.png" 412 915
|
||||
```
|
||||
|
||||
逐张检查认证页头、四项输入、验证码动作、按钮、登录回流、横向裁切、黑块和滚动可达性。
|
||||
|
||||
- [x] **Step 3: 完整回归。**
|
||||
|
||||
运行 A05 契约、A04 契约、A03 路由移除、A01/A02 契约、资产审计、截图脚本契约、编译审计、全页契约与 `git diff --check`。同步规划、交接和资产台账;用户已于 2026-07-14 明确验收 A05,因此将它写为已验收并冻结。
|
||||
@@ -0,0 +1,117 @@
|
||||
# A06 登录状态 Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. 用户禁止子代理、worktree、Git 暂存、提交、推送与上传。
|
||||
|
||||
**Goal:** 将 A06 做成可通过一个 `status` 路由参数表达六种真实认证结果、并可返回正确认证步骤的独立页面。
|
||||
|
||||
**Architecture:** `pages/auth/a06-auth-status.vue` 独立拥有状态配置、H5 查询参数解析和最小本地交互;它不再依赖 `ModulePage` 或 `data/page-catalog.js`。页面复用已验收认证位图资产,保留单一 A06 路由,避免为每个状态新建页面。
|
||||
|
||||
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 源码契约、Chrome DevTools 截图。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 仅修改 A06、它的契约、设计记录、规划/交接/资产台账和 A06 运行截图。
|
||||
- 不生成新资产;完整页面壳、面板、主按钮、边框与装饰面均引用现有位图,不以 CSS 伪造。
|
||||
- 不修改已验收并冻结的 A01、G01、A02、A04、A05 可见效果。
|
||||
- 手机号绑定不在本轮实现;它后续位于个人中心安全设置的独立页面。
|
||||
- 先红灯、后绿灯;完成前截图审视、回归并运行 `git diff --check`。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 固化 A06 多状态合同并替换通用页
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/a06-auth-status-contract.ps1`
|
||||
- Modify: `pages/auth/a06-auth-status.vue`
|
||||
- Modify: `data/page-catalog.js`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `?status=normal|failed|restricted|register-pending|wechat-cancelled|wechat-failed`、认证位图资产、A02 登录页、A04 注册页。
|
||||
- Produces: `resolveStatus`、`goLogin`、`goRegister`、`handlePrimary`、`goBack`;未知状态必须回退为 `normal`。
|
||||
|
||||
- [x] **Step 1: 写失败的最小契约**
|
||||
|
||||
创建 `tests/a06-auth-status-contract.ps1`,读取 `pages.json`、A06 源码与 `data/page-catalog.js`,断言:A06 路由仍存在、源码不含 `ModulePage`、目录不再含 `a06:`;六个 ASCII 状态键与四个动作函数存在;页面引用现有认证壳、面板、主按钮、云纹、分隔结、返回箭头和登录轮廓位图;面板和主按钮不使用 CSS `border`/`background` 伪造;A02 与 A04 路由存在。
|
||||
|
||||
- [x] **Step 2: 运行红灯**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
|
||||
```
|
||||
|
||||
预期:因当前 A06 仍渲染 `ModulePage`、目录仍有 `a06:` 而失败。
|
||||
|
||||
- [x] **Step 3: 写最小独立实现**
|
||||
|
||||
将 `pages/auth/a06-auth-status.vue` 改为认证状态页:用 `status` 查询键选择六条文案;每个状态仅给出一项可执行的下一步;`restricted` 的帮助只显示本地待接入提示;`register-pending` 去 A04;其余主操作及次操作去 A02。删除 `data/page-catalog.js` 的 `a06:` 临时条目。
|
||||
|
||||
- [x] **Step 4: 运行绿灯**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
```
|
||||
|
||||
预期:输出 `A06-AUTH-STATUS-CONTRACT PASS` 与 `PASS compile audit`。
|
||||
|
||||
### Task 2: 记录、真实截图与回归
|
||||
|
||||
**Files:**
|
||||
- Create: `docs/design/A06_登录状态_设计记录.md`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A06-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A06-after-412x915.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A06-restricted-360x800.png`
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Modify: `docs/design/视觉设计交接手册.md`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Task 1 的 `status` 状态合同和 Chrome CDP 9222。
|
||||
- Produces: 可审查截图、交接记录和等待用户验收的 A06。
|
||||
|
||||
- [x] **Step 1: 记录设计边界**
|
||||
|
||||
写 A06 设计记录,包含六状态映射、复用资产、未接入后端/客服/申诉能力、A02/A04 回流、截图位置和“等待用户审美验收”状态。
|
||||
|
||||
- [x] **Step 2: 捕获并审视真实页面**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a06-auth-status" ".auth-page" "docs/design/screens/runtime/2026-07-14/A06-after-360x800.png" 360 800
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a06-auth-status" ".auth-page" "docs/design/screens/runtime/2026-07-14/A06-after-412x915.png" 412 915
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a06-auth-status?status=restricted" ".auth-page" "docs/design/screens/runtime/2026-07-14/A06-restricted-360x800.png" 360 800
|
||||
```
|
||||
|
||||
逐张审视认证头图、卷轴面板、状态图形、主/次操作、底部留白、横向裁切和黑块;用 Chrome 实测默认返回登录、受限状态帮助提示、未完成注册去 A04。
|
||||
|
||||
- [x] **Step 3: 同步与完整回归**
|
||||
|
||||
更新规划、交接、资产台账与视觉手册,明确 A06 已实现并等待用户审美验收。运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-register-entry-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/capture-chrome-page-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
预期:全部通过;`git diff --check` 允许已有 CRLF 提示,但退出码必须为 0。用户已于 2026-07-14 明确验收 A06,故已同步为可见效果冻结。
|
||||
|
||||
## 自审
|
||||
|
||||
- 规格的六个状态、单一路由、资产限制、A02/A04 回流、截图与等待验收均被两个任务覆盖。
|
||||
- 本计划不含 TODO/TBD/“同 Task N”占位语,函数名和状态键在两个任务中一致。
|
||||
- 不提交 Git:项目规则覆盖计划模板中的提交建议。
|
||||
@@ -0,0 +1,198 @@
|
||||
# G01 无家谱状态合并实施计划
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 删除独立的 G02 页面路由,让“无家谱”成为 G01 在 `?state=empty` 下可复现、可验证的页面状态,同时保持 G01 默认已验收列表画面不变。
|
||||
|
||||
**Architecture:** `pages/genealogy/g01-my-genealogies.vue` 是“我的家谱”状态的唯一所有者:默认路由继续读取现有示例家谱数据,`state=empty` 只覆盖 `hasGenealogies` 的演示状态。G01 的空状态使用已生成的完整位图面板和现有按钮位图;G02 路由、专属实现、测试与已失效的专属交接材料删除。
|
||||
|
||||
**Tech Stack:** uni-app Vue 3、Vue Composition API、PowerShell 合约测试、Chrome DevTools 截图脚本、Node.js 运行时冒烟测试。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 不修改 G01 默认“已有家谱”状态的可见效果,也不修改已验收的 A01、A02、A04、A05、A06。
|
||||
- 可审计路由/视觉结构改动必须先有最小失败契约测试;行为验证必须覆盖默认与空状态。
|
||||
- 空状态完整面板、按钮边框和装饰面使用位图资产,不以 CSS 伪造。
|
||||
- 不执行 `git add`、`git commit`、`git push`、`git reset` 或 worktree 操作。
|
||||
- 仅删除本项目此前为独立 G02 创建、且在迁移后无引用的文件;保留最终位图并改为 G01 所属名称。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 建立 G01 空状态与路由收敛契约
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/g01-empty-state-contract.ps1`
|
||||
- Modify: `tests/full-page-visual-contract.ps1`
|
||||
- Test: `tests/g01-empty-state-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `pages.json` 路由注册、`pages/genealogy/g01-my-genealogies.vue`、`static/assets/modules/genealogy/opaque/g01-empty-panel.png`。
|
||||
- Produces: 证明 G01 是唯一入口、`state=empty` 是唯一空状态开关、并且 57 条已注册路由为新的页面契约的静态测试。
|
||||
|
||||
- [x] **Step 1: 写失败的合约测试**
|
||||
|
||||
在 `tests/g01-empty-state-contract.ps1` 断言:
|
||||
|
||||
```powershell
|
||||
Assert-True ($pages.paths -contains 'pages/genealogy/g01-my-genealogies') 'G01 route missing'
|
||||
Assert-True (-not ($pages.paths -contains 'pages/genealogy/g02-empty-genealogies')) 'G02 route must be removed'
|
||||
Assert-Match $g01Source 'forceEmptyState' 'G01 must own the explicit empty state'
|
||||
Assert-Match $g01Source 'state.*empty' 'G01 must parse state=empty'
|
||||
Assert-Match $g01Source 'g01-empty-panel\.png' 'G01 must use its final raster empty panel'
|
||||
Assert-Match $g01Source 'empty-create-action' 'G01 must expose create action in empty state'
|
||||
Assert-Match $g01Source 'empty-search-action' 'G01 must expose search action in empty state'
|
||||
Assert-NoCssSurface $g01Source 'empty-panel'
|
||||
Assert-NoCssSurface $g01Source 'empty-create-action'
|
||||
Assert-NoCssSurface $g01Source 'empty-search-action'
|
||||
```
|
||||
|
||||
并在 `tests/full-page-visual-contract.ps1` 中把期望页面数和完整清单收敛为 57 条,移除 G02。
|
||||
|
||||
- [x] **Step 2: 运行测试确认失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/g01-empty-state-contract.ps1`
|
||||
|
||||
Expected: FAIL,指出 G02 仍在路由表中,且 G01 尚未拥有 `forceEmptyState` 和最终 `g01-empty-panel.png`。
|
||||
|
||||
- [x] **Step 3: 记录失败原因**
|
||||
|
||||
失败不是视觉问题:现有 `pages.json` 将 G02 作为第二个页面注册,且现有 G01 空分支没有 URL 状态开关。这证明需要迁移所有权,而不是额外保留一个“空状态页面”。
|
||||
|
||||
### Task 2: 将空状态实现迁移到 G01
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/genealogy/g01-my-genealogies.vue`
|
||||
- Modify: `pages.json`
|
||||
- Move: `static/assets/modules/genealogy/opaque/g02-empty-panel-v2.png` to `static/assets/modules/genealogy/opaque/g01-empty-panel.png`
|
||||
- Test: `tests/g01-empty-state-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `state=empty` 路由参数和现有 G01 的 `createGenealogy()`、`applyToJoin()`。
|
||||
- Produces: 默认 G01 保持有家谱;`/pages/genealogy/g01-my-genealogies?state=empty` 展示带“创建我的家谱”和“搜索并申请加入”动作的空状态。
|
||||
|
||||
- [x] **Step 1: 实现最小路由状态所有权**
|
||||
|
||||
在 G01 里引入 `forceEmptyState`,在 `onLoad` 和 `onShow` 中同步当前页面 `options.state`(H5 时从 hash 查询串读取)。只用它定义:
|
||||
|
||||
```js
|
||||
const hasGenealogies = computed(() => !forceEmptyState.value && list.value.length > 0)
|
||||
```
|
||||
|
||||
默认路由不携带 `state=empty`,因此继续走现有已验收列表分支。
|
||||
|
||||
- [x] **Step 2: 替换 G01 的旧 CSS 空状态表面**
|
||||
|
||||
仅替换 `v-else` 空状态内容为:
|
||||
|
||||
```vue
|
||||
<view v-else class="genealogy-empty-state">
|
||||
<view class="empty-panel">
|
||||
<image class="empty-panel-skin" src="/static/assets/modules/genealogy/opaque/g01-empty-panel.png" mode="aspectFill" />
|
||||
<view class="empty-panel-content">
|
||||
<!-- 印章、标题、说明、分隔纹、创建与搜索动作 -->
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
```
|
||||
|
||||
按钮皮肤继续引用现有 `a01-primary-button.png` 与 `a01-secondary-button.png`。使用 `empty-create-action`、`empty-search-action` 等新类名,不能改动现有列表中 `.create-action` 的已验收样式;这两个动作分别继续调用 `createGenealogy()` 与 `applyToJoin()`。
|
||||
|
||||
- [x] **Step 3: 移除独立 G02 入口**
|
||||
|
||||
从 `pages.json` 删除 `pages/genealogy/g02-empty-genealogies`,删除 `pages/genealogy/g02-empty-genealogies.vue`,并将最终位图重命名为 `g01-empty-panel.png`。不保留 G02 兼容路由或重定向。
|
||||
|
||||
- [x] **Step 4: 运行静态契约确认通过**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/g01-empty-state-contract.ps1`
|
||||
|
||||
Expected: PASS,且 `powershell -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1` 输出 57 条路由清单通过。
|
||||
|
||||
### Task 3: 验证真实页面状态与动作
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/g01-empty-state-runtime-smoke.js`
|
||||
- Test: `tests/g01-empty-state-runtime-smoke.js`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Chrome DevTools `http://localhost:9222` 与开发服务器 `http://localhost:5173`。
|
||||
- Produces: 默认 G01 列表、空状态、创建跳转和搜索跳转的运行时证据。
|
||||
|
||||
- [x] **Step 1: 写运行时测试**
|
||||
|
||||
测试在同一浏览器中依序验证:
|
||||
|
||||
```js
|
||||
await open('/#/pages/genealogy/g01-my-genealogies?state=empty')
|
||||
await waitFor('.genealogy-empty-state .empty-create-action')
|
||||
await click('.empty-create-action')
|
||||
assertPath('/pages/genealogy/g03-create-genealogy')
|
||||
await open('/#/pages/genealogy/g01-my-genealogies?state=empty')
|
||||
await click('.empty-search-action')
|
||||
assertPath('/pages/genealogy/g06-search-genealogies')
|
||||
await open('/#/pages/genealogy/g01-my-genealogies')
|
||||
assertExists('.current-slip')
|
||||
assertMissing('.genealogy-empty-state')
|
||||
```
|
||||
|
||||
- [x] **Step 2: 运行运行时测试确认通过**
|
||||
|
||||
Run: `node tests/g01-empty-state-runtime-smoke.js http://localhost:5173`
|
||||
|
||||
Expected: PASS,证明两个空状态动作可用,且不带参数的 G01 仍为默认列表。
|
||||
|
||||
### Task 4: 截图审视、清理与交接同步
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/交接记录.md`
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Modify: `docs/design/2026-07-14_页面与状态合并审计.md`
|
||||
- Delete: `tests/g02-empty-genealogies-contract.ps1`
|
||||
- Delete: `tests/g02-empty-genealogies-runtime-smoke.js`
|
||||
- Delete: `docs/design/G02_无家谱空状态_设计记录.md`
|
||||
- Delete: `docs/superpowers/specs/2026-07-14-g02-empty-genealogies-design.md`
|
||||
- Delete: `docs/superpowers/plans/2026-07-14-g02-empty-genealogies.md`
|
||||
- Delete: `docs/design/screens/runtime/2026-07-14/G02-before-360x800.png`
|
||||
- Delete: `docs/design/screens/runtime/2026-07-14/G02-before-412x915.png`
|
||||
- Delete: `docs/design/screens/runtime/2026-07-14/G02-after-360x800.png`
|
||||
- Delete: `docs/design/screens/runtime/2026-07-14/G02-after-412x915.png`
|
||||
- Delete: `docs/design/screens/runtime/2026-07-14/G01-G02-comparison-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G01-empty-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G01-empty-after-412x915.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G01-default-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G01-default-before-after-360x800.png`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: G01 的两种可达状态、迁移后的 57 路由契约、审计前的 `route-audit/G01-360x800.png`。
|
||||
- Produces: 同一视口的默认态前后对比、空状态截图、无过期 G02 入口和准确的交接记录。
|
||||
|
||||
- [x] **Step 1: 截图并做同图对比审视**
|
||||
|
||||
在 360×800 截默认 G01 和 `state=empty`,在 412×915 截空状态;把迁移前 `route-audit/G01-360x800.png` 与迁移后默认图并排为一张对比图。使用图像查看确认默认态没有发生可见改动,并确认空状态不出现透明黑角、裁切或 CSS 伪造表面。
|
||||
|
||||
- [x] **Step 2: 清除过期 G02 资料**
|
||||
|
||||
在 `rg` 确认没有其余活跃引用后,删除仅属于独立 G02 的路由实现、测试、计划、设计记录和旧截图。保留路线审计里的总览截图,避免抹除先前审计证据。
|
||||
|
||||
- [x] **Step 3: 更新真实状态**
|
||||
|
||||
文档统一为:已注册路由 57 条;G01 默认列表仍已验收;G01 `state=empty` 已实现和截图验证、等待用户对新增状态的审美确认;下一项合并仍是 G04→G03,尚未开始。
|
||||
|
||||
- [x] **Step 4: 完成回归验证**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File tests/g01-empty-state-contract.ps1
|
||||
node tests/g01-empty-state-runtime-smoke.js http://localhost:5173
|
||||
powershell -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/visual-asset-compliance.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/a01-landing-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/a02-login-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/a04-forgot-password-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/a05-register-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
Expected: 全部通过;`git diff --check` 允许 CRLF 警告但无空白错误。
|
||||
@@ -0,0 +1,163 @@
|
||||
# G03 创建家谱流程收敛实施计划
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 把 G04 始祖录入收敛为 G03 的第二步,保留创建/录入的真实数据行为,使独立路由由 57 条降到 56 条。
|
||||
|
||||
**Architecture:** `pages/genealogy/g03-create-genealogy.vue` 是创建家谱流程的唯一所有者;默认 `step=create` 创建家谱,`step=ancestor&genealogyId=…` 录入首代。成功创建后使用同一 G03 URL 进入第二步;首代创建成功后才进入 T01。G04 路由与页面彻底删除,不保留兼容入口。
|
||||
|
||||
**Tech Stack:** uni-app Vue 3、Vue Composition API、uni-app 生命周期、既有 `appApi`/`genealogyContext`、PowerShell 契约测试、Chrome DevTools 运行时冒烟、ImageGen 位图资产。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 不触碰已验收 A01、A02、A04、A05、A06、G01 默认态和 G01 空状态的可见效果。
|
||||
- 完整页头、表单面板、主按钮均使用完整位图资产;CSS 只负责布局、文字、字段状态与交互。
|
||||
- 路由/状态/行为变化先写失败契约;无 G04 兼容路由、重定向或重复页面。
|
||||
- 不执行 `git add`、`git commit`、`git push`、`git reset` 或 worktree 操作。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 固化唯一 G03 创建流程合同
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/g03-create-flow-contract.ps1`
|
||||
- Modify: `tests/full-page-visual-contract.ps1`
|
||||
- Modify: `tests/a03-route-removal-contract.ps1`
|
||||
- Test: `tests/g03-create-flow-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `pages.json`、当前 G03/G04 页面、`appApi`、`genealogyContext`。
|
||||
- Produces: 证明 G03 是唯一创建流程入口、G04 不存在、`step=create|ancestor` 是唯一状态合同、位图表面不可被 CSS 伪造的静态守卫。
|
||||
|
||||
- [x] **Step 1: 写失败契约**
|
||||
|
||||
```powershell
|
||||
Assert-RoutePresent 'pages/genealogy/g03-create-genealogy'
|
||||
Assert-RouteAbsent 'pages/genealogy/g04-first-ancestor'
|
||||
Assert-FileAbsent 'pages/genealogy/g04-first-ancestor.vue'
|
||||
Assert-Contains $g03 'step=ancestor&genealogyId='
|
||||
Assert-Contains $g03 'appApi.createGenealogy'
|
||||
Assert-Contains $g03 'appApi.createPerson'
|
||||
Assert-Contains $g03 'g03-create-flow-panel.png'
|
||||
Assert-NoCssSurface $g03 'create-flow-panel'
|
||||
Assert-NoCssSurface $g03 'flow-primary-action'
|
||||
```
|
||||
|
||||
- [x] **Step 2: 运行并确认失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/g03-create-flow-contract.ps1`
|
||||
|
||||
Expected: FAIL,指出 G04 路由和文件仍存在,且 G03 还没有祖先步骤与位图面板。
|
||||
|
||||
### Task 2: 生成并审视创建流程位图面板
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/modules/genealogy/opaque/g03-create-flow-panel.png`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Test: `tests/g03-create-flow-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: G01 的暖宣纸、古金、淡墨山水视觉语言与 G03 约 656rpx 宽、876rpx 高的面板槽位。
|
||||
- Produces: 1122×1500 的不透明表单面板位图,供 G03 两个流程状态共用。
|
||||
|
||||
- [x] **Step 1: 用 ImageGen 生成单一最终候选**
|
||||
|
||||
Use case: `ui-mockup`。生成暖宣纸全画布、不透明、古金双线框、回纹角饰、极淡右上云纹和底沿淡墨山水的竖向面板;禁止文字、按钮、Logo、人物、黑角、透明区域。
|
||||
|
||||
- [x] **Step 2: 将候选移入项目并验证位图**
|
||||
|
||||
最终文件为 `g03-create-flow-panel.png`;检查 1122×1500、四角 alpha=255、没有黑角,并在 P00 标注其只服务 G03 的 `create|ancestor` 两个状态。
|
||||
|
||||
### Task 3: 实现 G03 的两个真实步骤并移除 G04
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/genealogy/g03-create-genealogy.vue`
|
||||
- Modify: `pages.json`
|
||||
- Delete: `pages/genealogy/g04-first-ancestor.vue`
|
||||
- Test: `tests/g03-create-flow-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: 查询参数 `step`、`genealogyId`;`appApi.createGenealogy`、`appApi.createPerson`;`genealogyContext`。
|
||||
- Produces: G03 默认创建态、G03 首代录入态、两个状态各自校验和真实跳转。
|
||||
|
||||
- [x] **Step 1: 添加明确路由状态同步**
|
||||
|
||||
在 `onLoad`/`onShow` 同步当前查询参数。缺失或非 `ancestor` 的 `step` 一律为 `create`;祖先步骤从 `genealogyId` 或 `genealogyContext` 读取家谱 ID。
|
||||
|
||||
- [x] **Step 2: 保留创建行为并改为同路由下一步**
|
||||
|
||||
`submitCreate()` 继续验证姓氏与谱名、调用 `appApi.createGenealogy()` 和设置上下文;成功后:
|
||||
|
||||
```js
|
||||
uni.redirectTo({
|
||||
url: `/pages/genealogy/g03-create-genealogy?step=ancestor&genealogyId=${created.id}`,
|
||||
})
|
||||
```
|
||||
|
||||
- [x] **Step 3: 内嵌祖先录入行为**
|
||||
|
||||
`submitAncestor()` 保留首代姓名校验和 `appApi.createPerson()`;成功后仍跳转 T01。祖先步骤的返回动作回 G03 默认创建态;默认创建态使用 `uni.navigateBack()`。
|
||||
|
||||
- [x] **Step 4: 替换通用 CSS 视觉面**
|
||||
|
||||
采用 G01 的纸纹、下沿山水和 `root-header-cinnabar.jpg`,在本页构建位图页头;两个步骤共用 `g03-create-flow-panel.png`;按钮引用 `a01-primary-button.png`。`create-flow-panel` 与 `flow-primary-action` 不能有 CSS `border`、`background` 或 `border-radius`。
|
||||
|
||||
- [x] **Step 5: 删除 G04 并运行静态合同**
|
||||
|
||||
从 `pages.json` 删除 G04,删除其 Vue 文件;`full-page-visual-contract` 与 A03 路由测试的总数改为 56。运行:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File tests/g03-create-flow-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
|
||||
```
|
||||
|
||||
Expected: 全部 PASS。
|
||||
|
||||
### Task 4: 真实流程、截图、清理和交接
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/g03-create-flow-runtime-smoke.js`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G03-create-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G03-ancestor-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G03-ancestor-after-412x915.png`
|
||||
- Modify: `docs/交接记录.md`
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/design/视觉设计交接手册.md`
|
||||
- Modify: `docs/design/2026-07-14_页面与状态合并审计.md`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: G03 两步 URL、Chrome DevTools `9222`、当前 56 路由合同。
|
||||
- Produces: 可复现的创建链路证据、准确的路线数与“G03 两步视觉等待用户确认”停点。
|
||||
|
||||
- [x] **Step 1: 写并运行真实 Chrome 冒烟测试**
|
||||
|
||||
依次验证:默认 G03 显示创建表单;填写姓氏与谱名并点击主动作后进入 G03 祖先步骤;刷新后祖先步骤仍在;填写首代姓名后进入 T01;直接访问默认 G03 仍是创建步骤。
|
||||
|
||||
- [x] **Step 2: 截图并审视**
|
||||
|
||||
使用相同 Chrome/视口截取两步;并排比较 G01 根页视觉基准与 G03 的纸纹、页头、面板和按钮。检查图片已加载、无黑角、无横向裁切、字段和主动作完整可达。
|
||||
|
||||
- [x] **Step 3: 同步当前状态**
|
||||
|
||||
更新文档为:G01 空态已获用户验收;G04 已合并为 G03 `step=ancestor`;当前独立路由 56 条;G03 两步已实现/截图/自动验证,等待用户审美确认;下一项是 G07→G06。
|
||||
|
||||
- [x] **Step 4: 完成回归**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File tests/g03-create-flow-contract.ps1
|
||||
node tests/g03-create-flow-runtime-smoke.js http://localhost:5173
|
||||
powershell -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/g01-empty-state-contract.ps1
|
||||
node tests/g01-empty-state-runtime-smoke.js http://localhost:5173
|
||||
powershell -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
Expected: 全部通过;`git diff --check` 只允许现有 CRLF 警告,不存在空白错误。
|
||||
@@ -0,0 +1,215 @@
|
||||
# G06 搜索流程合并 Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 将 G07 搜索结果收敛到 G06 的页面内三态,并保持搜索、无结果和申请入口可验证。
|
||||
|
||||
**Architecture:** `pages/genealogy/g06-search-genealogies.vue` 作为唯一流程拥有者,初始、加载、结果、无结果均由本地响应式状态切换;结果点选仅进入保留的 G08 路由。G07 文件和路由完全删除;公开检索是单步任务,直接在页面纸纹上放置独立的输入框与按钮位图,结果项复用现有 `GenealogyCard` 位图框架。
|
||||
|
||||
**Tech Stack:** uni-app、Vue 3 `<script setup>`、现有 mock `appApi`、PowerShell 静态契约、Chrome DevTools Protocol 冒烟测试、ImageGen 位图资产。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 不改动 A01、A02、A04、A05、A06、G01、G03 已验收的可见效果。
|
||||
- 不使用 CSS 绘制检索面板、结果卡、按钮、边框或装饰面;只定位完整位图资产和真实交互控件。
|
||||
- 不执行 `git add`、`git commit`、`git push`、重置或 worktree 操作;保留现有未提交改动。
|
||||
- 本轮完成后路由总数必须为 55,G07 不得保留兼容入口。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 写入并确认 G06 收敛契约(RED)
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/g06-search-flow-contract.ps1`
|
||||
- Create: `tests/g06-search-flow-runtime-smoke.js`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: G06 路由、`g06-search-genealogies.vue`、新面板资产和 Chrome 调试端 `9222`。
|
||||
- Produces: 对 G06 唯一路由、四态、G08 导航、位图表面以及四条核心交互的可重复检查。
|
||||
|
||||
- [x] **Step 1: 写静态失败契约**
|
||||
|
||||
```powershell
|
||||
if ($paths -contains 'pages/genealogy/g07-search-result') { throw 'G07 route must be removed' }
|
||||
if (Test-Path $g07File) { throw 'G07 page file must be deleted' }
|
||||
foreach ($required in @('const searchState = ref("initial")', 'searchState.value = "results"', 'searchState.value = "empty"', '/pages/genealogy/g08-join-application?genealogyId=', 'g06-search-input.png', 'g06-search-button.png', 'search-hero')) {
|
||||
Assert-Contains $g06 $required "Missing G06 flow contract: $required"
|
||||
}
|
||||
```
|
||||
|
||||
- [x] **Step 2: 运行静态契约,确认因 G07 和新状态/资产尚不存在而失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/g06-search-flow-contract.ps1`
|
||||
|
||||
Expected: FAIL,错误直接指向仍存在的 G07 或缺少的 G06 状态/资产。
|
||||
|
||||
- [x] **Step 3: 写运行时失败冒烟**
|
||||
|
||||
```js
|
||||
await openG06(send)
|
||||
await waitFor(send, "Boolean(document.querySelector('.search-initial'))", 'G06 initial state did not render')
|
||||
if (await valueOf(send, "Boolean(document.querySelector('.genealogy-card'))")) throw new Error('G06 initial state must not reveal a result card')
|
||||
await setSearchKeyword(send, '汤')
|
||||
await waitFor(send, "Boolean(document.querySelector('.genealogy-card'))", 'G06 matching search did not render a result card')
|
||||
await setSearchKeyword(send, '不存在的家谱')
|
||||
await waitFor(send, "Boolean(document.querySelector('.search-empty'))", 'G06 empty search state did not render')
|
||||
```
|
||||
|
||||
- [x] **Step 4: 运行冒烟,确认因初始态选择器尚不存在而失败**
|
||||
|
||||
Run: `node tests/g06-search-flow-runtime-smoke.js http://localhost:5173`
|
||||
|
||||
Expected: FAIL with `G06 initial state did not render`。
|
||||
|
||||
### Task 2: 制作并验证 G06 独立检索资产
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/modules/genealogy/opaque/g06-search-input.png`
|
||||
- Create: `static/assets/modules/genealogy/opaque/g06-search-button.png`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: G03 已确认的暖象牙、古金与淡墨设计语言。
|
||||
- Produces: 720×248 的独立输入皮肤、300×132 的独立按钮皮肤;两张资产均四角不透明。
|
||||
|
||||
- [x] **Step 1: 用 ImageGen 生成没有文字的输入与按钮位图**
|
||||
|
||||
提示词必须要求:输入和按钮以独立完整位图生成;不得出现文字、输入内容、设备框、水印或透明角。
|
||||
|
||||
- [x] **Step 2: 将生成结果规范为 1122×820 PNG 并检查四角 alpha**
|
||||
|
||||
```powershell
|
||||
$bitmap = [System.Drawing.Bitmap]::FromFile('static/assets/modules/genealogy/opaque/g06-search-input.png')
|
||||
if ($bitmap.Width -ne 720 -or $bitmap.Height -ne 248) { throw 'Unexpected G06 input size' }
|
||||
if (@($bitmap.GetPixel(0,0).A, $bitmap.GetPixel(719,0).A, $bitmap.GetPixel(0,247).A, $bitmap.GetPixel(719,247).A) | Where-Object { $_ -ne 255 }) { throw 'G06 input corners must be opaque' }
|
||||
```
|
||||
|
||||
- [x] **Step 3: 登记资产的语义、尺寸、引用位置和状态**
|
||||
|
||||
在 P00 的资产清单中写入 `modules/genealogy/opaque/g06-search-input.png`、`g06-search-button.png` 两条正式路径,标明分别由真实输入和真实搜索动作使用。
|
||||
|
||||
### Task 3: 以最小实现合并 G07 到 G06(GREEN)
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/genealogy/g06-search-genealogies.vue`
|
||||
- Modify: `pages.json`
|
||||
- Delete: `pages/genealogy/g07-search-result.vue`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `appApi.getPublicGenealogies()` 返回的 `name`、`surname`、`location` 和 `id`;`GenealogyCard` 的 `genealogy`、`role`、`select` 接口。
|
||||
- Produces: `.search-initial`、`.search-results`、`.search-empty` 运行时节点和 G08 导航。
|
||||
|
||||
- [x] **Step 1: 将 G06 默认结果清空,数据加载仅完成数据准备**
|
||||
|
||||
```js
|
||||
const keyword = ref('')
|
||||
const allResults = ref([])
|
||||
const results = ref([])
|
||||
const searchState = ref('initial')
|
||||
|
||||
onMounted(async () => {
|
||||
searchState.value = 'loading'
|
||||
allResults.value = await appApi.getPublicGenealogies()
|
||||
searchState.value = 'initial'
|
||||
})
|
||||
```
|
||||
|
||||
- [x] **Step 2: 只在提交时筛选并切换结果/无结果状态**
|
||||
|
||||
```js
|
||||
const search = () => {
|
||||
const value = keyword.value.trim()
|
||||
results.value = value
|
||||
? allResults.value.filter((item) => `${item.name}${item.surname}${item.location}`.includes(value))
|
||||
: allResults.value
|
||||
searchState.value = results.value.length ? 'results' : 'empty'
|
||||
}
|
||||
|
||||
const openApply = (genealogy) => uni.navigateTo({ url: `/pages/genealogy/g08-join-application?genealogyId=${genealogy.id}` })
|
||||
```
|
||||
|
||||
- [x] **Step 3: 以位图面板承载输入区,复用题签结果卡**
|
||||
|
||||
模板包含 `search-hero`、独立的输入/按钮位图、真实 `<input>`、真实点击层、初始/加载/无结果文案和 `GenealogyCard role="可申请"`。相应 CSS 只负责布局、层级、文字和尺寸;`.search-field` 与 `.search-action` 不得写 `background`、`border` 或 `border-radius`。
|
||||
|
||||
- [x] **Step 4: 从 `pages.json` 删除 G07 并物理删除 G07 页面文件**
|
||||
|
||||
删除唯一 `pages/genealogy/g07-search-result` 条目和 `pages/genealogy/g07-search-result.vue`,不添加重定向。
|
||||
|
||||
- [x] **Step 5: 运行新契约和冒烟测试,确认转绿**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/g06-search-flow-contract.ps1`
|
||||
|
||||
Expected: `G06-SEARCH-FLOW-CONTRACT PASS`
|
||||
|
||||
Run: `node tests/g06-search-flow-runtime-smoke.js http://localhost:5173`
|
||||
|
||||
Expected: `G06-SEARCH-FLOW-RUNTIME-SMOKE PASS`
|
||||
|
||||
### Task 4: 同步全局契约、文档与视觉证据
|
||||
|
||||
**Files:**
|
||||
- Modify: `tests/full-page-visual-contract.ps1`
|
||||
- Modify: `tests/a03-route-removal-contract.ps1`
|
||||
- Modify: `docs/交接记录.md`
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/design/视觉设计交接手册.md`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Modify: `docs/design/2026-07-14_页面与状态合并审计.md`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G06-initial-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G06-results-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G06-empty-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/G06-results-after-412x915.png`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: 删除 G07 后的 55 条 `pages.json` 路由和 G06 三态截图。
|
||||
- Produces: 当前路由数、G03 已通过状态和下一项 T02→T01 的准确交接记录。
|
||||
|
||||
- [x] **Step 1: 将全量路由数组和计数更新为 55**
|
||||
|
||||
从 `tests/full-page-visual-contract.ps1` 的预期数组删除 G07;两个契约都将 `56` 改为 `55`,并把说明改为已完成的三次合并。
|
||||
|
||||
- [x] **Step 2: 截取并逐张审视 G06 初始、有结果、无结果与 412×915 结果状态**
|
||||
|
||||
```powershell
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/genealogy/g06-search-genealogies" ".search-page" "docs/design/screens/runtime/2026-07-14/G06-initial-after-360x800.png" 360 800
|
||||
```
|
||||
|
||||
结果和无结果截图由 Chrome 调试执行真实输入后取得;检查无黑角、无裁切、面板与题签框完整,且初始态没有结果卡。
|
||||
|
||||
- [x] **Step 3: 更新当前交接文档**
|
||||
|
||||
写明 G03 已获用户继续授权、G07 已合并到 G06、当前为 55 路由,下一项为 T02→T01;历史计划不做回写。
|
||||
|
||||
- [x] **Step 4: 运行相关全量静态契约、冒烟、截图检查和 Git 空白检查**
|
||||
|
||||
```powershell
|
||||
Get-ChildItem tests -Filter *.ps1 | ForEach-Object { powershell -ExecutionPolicy Bypass -File $_.FullName }
|
||||
node tests/g06-search-flow-runtime-smoke.js http://localhost:5173
|
||||
node tests/g03-create-flow-runtime-smoke.js http://localhost:5173
|
||||
node tests/g01-empty-state-runtime-smoke.js http://localhost:5173
|
||||
git diff --check
|
||||
```
|
||||
|
||||
Expected: 所有测试通过,`git diff --check` 仅可出现既有 CRLF 警告且退出码为 0。
|
||||
|
||||
## Plan Self-Review
|
||||
|
||||
- 覆盖性:四个任务分别覆盖契约、位图资产、G06/G07 收敛、文档和完成前验证。
|
||||
- 无占位项:状态名、路由、资产路径、选择器和验证命令均已明确。
|
||||
- 边界:不触及 G08 实现、其他合并项或已验收可见效果;Git 操作由用户保留。
|
||||
|
||||
### Task 5: 用户审视后的 G06 控件层级修正
|
||||
|
||||
- [x] 复现并确认:绝对定位的面板纸纹覆盖了静态 `PageHeader`,且输入槽和动作槽被烘焙在同一张背景中,造成不可交互的截图感。
|
||||
- [x] 先将“可见页头、独立输入皮肤、独立按钮皮肤”写入 `tests/g06-search-flow-contract.ps1`,确认契约因缺少新结构而失败。
|
||||
- [x] 以 ImageGen 制作过无控件的面板版本并制作独立 `g06-search-input.png`、`g06-search-button.png`;视觉审视后确认大型面板仍有设计稿感,已删除该短期资产,最终只保留两张独立控件位图。
|
||||
- [x] 将 `PageHeader` 包入高层级容器;在独立输入/按钮位图上叠放真实输入与点击控件,不改 G06 状态、筛选或 G08 跳转行为。
|
||||
- [x] 截取并审视 `G06-correction-after-initial-360x800.png`、`G06-correction-after-results-360x800.png`、`G06-correction-after-empty-360x800.png` 和前后对比图;运行 G06 静态契约与 Chrome 冒烟。
|
||||
|
||||
### Task 6: 用户选定第 3 稿后的 G06 题签收尾(在用户要求停止时暂停)
|
||||
|
||||
- [x] 根据用户选择的最近 ImageGen 第 3 稿,写入/更新 G06 静态契约,要求朱砂题签、宽输入框、独立按钮和真实品牌谱印。
|
||||
- [x] 新增 `g06-search-title-strip.png` 与 `g06-search-input-wide.png`,在 Vue 中用项目 `brand-seal.png` 覆盖题签的通用印玺;不改搜索状态、筛选和 G08 跳转。
|
||||
- [x] 运行 G06 静态契约和 Chrome 运行冒烟,并保存最后候选的初始态运行图:`docs/design/screens/runtime/2026-07-14/G06-selected-strip-final-initial-360x800.png`。
|
||||
- [ ] 重新截取并审视最后候选的结果态与无结果态;请求用户对 G06 三态作最终审美确认。**用户已要求停止当前工作并转交到另一台电脑,禁止擅自继续。**
|
||||
@@ -0,0 +1,176 @@
|
||||
# 移除 A03 重复认证页实施计划
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task in the current workspace. 用户明确禁止子代理、worktree、Git 暂存、提交、推送与上传;不使用 `subagent-driven-development`。
|
||||
|
||||
**Goal:** 删除重复的 A03 手机验证码页,让 A02 的短信 Tab 成为唯一手机号验证码登录入口,并把最终路由合同从 59 条收敛到 58 条。
|
||||
|
||||
**Architecture:** `pages/auth/a02-login.vue` 已是短信登录的唯一所有者,不改动其可见效果。删除 A03 页面文件、路由声明和临时 `pageCatalog` 条目;页面清单只由 `tests/full-page-visual-contract.ps1` 管理,并在同轮改为 58 条。个人中心绑定手机号和真实微信授权均不在本轮实现。
|
||||
|
||||
**Tech Stack:** uni-app Vue 3、PowerShell 契约审计、Chrome DevTools 截图、Git 只读检查。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- A01、A02、G01 的可见效果已获用户验收,禁止修改。
|
||||
- A02 的短信 Tab 是手机号验证码登录的唯一入口;A03 不保留重定向、兼容入口或重复表单。
|
||||
- 绑定手机号以后属于个人中心安全设置;微信授权取消、失败、受限以后属于 A06。
|
||||
- 不新增真实短信、微信授权、登录、注册或后端接口,不生成新视觉资产。
|
||||
- 不执行 `git add`、`git commit`、`git push`、上传、reset 或 worktree 操作。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 先固化 A03 删除合同,再移除运行时入口
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/a03-route-removal-contract.ps1`
|
||||
- Modify: `tests/full-page-visual-contract.ps1`
|
||||
- Modify: `pages.json`
|
||||
- Modify: `data/page-catalog.js`
|
||||
- Delete: `pages/auth/a03-mobile-verify.vue`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `pages.json` 的最终路径数组、`data/page-catalog.js` 的临时母版条目。
|
||||
- Produces: 58 条最终路由;不存在 `pages/auth/a03-mobile-verify`、`a03` 目录条目或 A03 页面文件。
|
||||
|
||||
- [x] **Step 1: 写失败的 A03 删除合同。**
|
||||
|
||||
创建 `tests/a03-route-removal-contract.ps1`:
|
||||
|
||||
```powershell
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$root = Split-Path -Parent $PSScriptRoot
|
||||
$pages = Get-Content -LiteralPath (Join-Path $root 'pages.json') -Raw -Encoding utf8 | ConvertFrom-Json
|
||||
$catalog = Get-Content -LiteralPath (Join-Path $root 'data/page-catalog.js') -Raw -Encoding utf8
|
||||
$a03File = Join-Path $root 'pages/auth/a03-mobile-verify.vue'
|
||||
|
||||
if ($pages.pages.path -contains 'pages/auth/a03-mobile-verify') { throw 'A-03 must not remain in pages.json' }
|
||||
if (Test-Path -LiteralPath $a03File) { throw 'A-03 page file must be deleted' }
|
||||
if ($catalog -match '(?m)^\s*a03\s*:') { throw 'A-03 catalog entry must be deleted' }
|
||||
if ($pages.pages.Count -ne 58) { throw "Expected 58 final routes, found $($pages.pages.Count)." }
|
||||
|
||||
Write-Output 'A03-ROUTE-REMOVAL-CONTRACT PASS'
|
||||
```
|
||||
|
||||
在 `tests/full-page-visual-contract.ps1` 中删除 `'pages/auth/a03-mobile-verify'`,并把 `59` 改为 `58`。
|
||||
|
||||
- [x] **Step 2: 运行并确认红灯。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
```
|
||||
|
||||
预期:前者报告 A03 仍在 `pages.json`;后者报告期望 58 条、实际 59 条。
|
||||
|
||||
- [x] **Step 3: 最小删除旧合同。**
|
||||
|
||||
从 `pages.json` 删除整个对象:
|
||||
|
||||
```json
|
||||
{
|
||||
"path": "pages/auth/a03-mobile-verify",
|
||||
"style": { "navigationStyle": "custom" }
|
||||
}
|
||||
```
|
||||
|
||||
从 `data/page-catalog.js` 删除整个 `a03` 单行对象,并删除 `pages/auth/a03-mobile-verify.vue`。不修改 A01、A02、A04--A06 文件。
|
||||
|
||||
- [x] **Step 4: 运行绿灯合同。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
```
|
||||
|
||||
预期:依次输出 `A03-ROUTE-REMOVAL-CONTRACT PASS`、`FULL-PAGE-VISUAL-CONTRACT PASS`、`PASS compile audit`。
|
||||
|
||||
### Task 2: 同步当前产品事实与旧任务边界
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
- Modify: `docs/design/视觉设计交接手册.md`
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Modify: `docs/design/A02_账号登录_设计记录.md`
|
||||
- Modify: `docs/superpowers/specs/2026-07-14-a02-agreement-control-design.md`
|
||||
- Modify: `docs/superpowers/plans/2026-07-14-a02-agreement-control.md`
|
||||
- Modify: `docs/superpowers/plans/2026-07-13-product-design-visual-refinement.md`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `docs/superpowers/specs/2026-07-14-remove-a03-redundant-auth-route-design.md` 的已确认决策。
|
||||
- Produces: 当前规划、交接和认证设计记录都只把 A02 视为验证码登录入口,并声明 A03 已删除、绑定手机号归个人中心、微信异常归 A06。
|
||||
|
||||
- [x] **Step 1: 更新当前范围和计数。**
|
||||
|
||||
在 `docs/规划.md` 中把最终路由数从 59 改为 58,删除 A-03 清单项,把账户模块范围改为 A01、A02、A04--A06,并把下一步改为 A04。
|
||||
|
||||
在 `docs/交接记录.md` 中把“下一步审视 A03”改为“下一步审视 A04”,并明确 A03 已删除、A02 短信 Tab 唯一承接验证码登录。
|
||||
|
||||
- [x] **Step 2: 更新认证职责说明。**
|
||||
|
||||
在交接手册和 A01/A02 设计记录中把“验证码/微信回跳归 A03”改为:验证码归 A02;微信授权取消、失败、受限归 A06;绑定手机号归个人中心后续独立页。A01 保持当前微信待接入提示,不新增跳转。
|
||||
|
||||
- [x] **Step 3: 标记旧 A03 计划已被取代。**
|
||||
|
||||
在列出的日期计划和规格中保留历史执行事实,但在开头加入一行:
|
||||
|
||||
```markdown
|
||||
> 现行范围更新:A03 已于 2026-07-14 删除;验证码登录归 A02,绑定手机号归个人中心,微信异常归 A06。历史方案不再作为实现依据。
|
||||
```
|
||||
|
||||
在 `2026-07-13-product-design-visual-refinement.md` 的认证任务中删除 A03 文件和截图要求,任务名称改为“完成认证模块 A04--A06”。
|
||||
|
||||
- [x] **Step 4: 文档引用审计。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
rg -n --glob '!unpackage/**' "a03-mobile-verify|A-03.*手机验证|A03.*手机号验证码" docs pages.json data tests
|
||||
```
|
||||
|
||||
预期:没有当前范围、运行时路径或测试合同仍把 A03 定义为手机号验证码登录;日期历史文档只有明确的“现行范围更新”说明。
|
||||
|
||||
### Task 3: 验证 A02 唯一入口与冻结页回归
|
||||
|
||||
**Files:**
|
||||
- Create: `docs/design/screens/runtime/2026-07-14/A02-sms-tab-after-a03-removal-360x800.png`
|
||||
- Modify: `docs/design/A02_账号登录_设计记录.md`
|
||||
- Modify: `design-qa.md`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `scripts/capture-chrome-page.js` 的 `sms-tab` 动作与 A02 已验收的短信 Tab。
|
||||
- Produces: A02 短信 Tab 是唯一验证码登录入口的运行时证据;A01/A02 不发生可见回退。
|
||||
|
||||
- [x] **Step 1: 捕获并审视 A02 短信 Tab。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a02-login" ".auth-page" "docs/design/screens/runtime/2026-07-14/A02-sms-tab-after-a03-removal-360x800.png" 360 800 sms-tab
|
||||
```
|
||||
|
||||
打开保存的 PNG,接受条件:祠堂头、卷轴面板、手机号和验证码输入行、获取验证码、朱砂登录按钮均完整;不得出现 A03、CSS 通用表单卡、黑块或半渲染。
|
||||
|
||||
- [x] **Step 2: 记录迁移事实。**
|
||||
|
||||
在 A02 设计记录和 `design-qa.md` 增加本轮事实:A02 短信 Tab 是唯一入口;A03 重复页已删除;本轮截图已检查。A02 保持 `accepted`,不重新打开其视觉验收。
|
||||
|
||||
- [x] **Step 3: 运行最终验证。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-register-entry-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/capture-chrome-page-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
预期:所有 PowerShell 脚本输出 PASS;`git diff --check` 没有真实空白错误。最后报告 A03 已删除、A02 截图已审视,以及 A04 是下一步待审视页面;不声明 A04--A06 已完成。
|
||||
@@ -0,0 +1,37 @@
|
||||
# T01 世系树状态收敛 Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 将 T02 小屏、空数据和失败提示收敛进 T01,保留世系节点交互并以位图资产替代 CSS 表面。
|
||||
|
||||
**Architecture:** T01 读取 `state` 和 `genealogyId`,由一个 `treeState` 唯一管理四种同页状态。T02 文件与路由删除;所有节点/画布/底部信息表面由三个不透明位图承载。
|
||||
|
||||
**Tech Stack:** uni-app、Vue 3、现有 mock `appApi`、ImageGen、PowerShell 静态契约、Chrome DevTools Protocol 冒烟。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 仅修改 T01/T02 收敛涉及的文件,不触碰已验收页面可见效果。
|
||||
- 位图承载完整画布、节点、信息条、边框和装饰;CSS 只负责布局、文字、状态与交互。
|
||||
- 不执行 Git 暂存、提交、推送、重置或 worktree 操作。
|
||||
|
||||
### Task 1: TDD 契约(RED)
|
||||
|
||||
- [ ] 创建 `tests/t01-tree-state-contract.ps1` 与 `tests/t01-tree-state-runtime-smoke.js`。
|
||||
- [ ] 静态契约要求 T02 路由/文件不存在,T01 含 `tree|landscape|empty|error`、三张位图、T03/T04 跳转和无 CSS 表面;运行冒烟要求三种查询状态及 `genealogyId=1001` 节点跳转。
|
||||
- [ ] 运行两个新测试,确认当前实现因 T02 仍存在和 T01 缺少状态节点而红灯。
|
||||
|
||||
### Task 2: 位图资产
|
||||
|
||||
- [ ] 用 ImageGen 生成 1122×1320 不透明 `t01-tree-canvas.png`、280×228 不透明 `t01-member-node.png`、1122×280 不透明 `t01-member-sheet.png`;均检查尺寸和四角 alpha。
|
||||
- [ ] 在 P00 登记路径、用途、尺寸、T01 引用与不透明属性。
|
||||
|
||||
### Task 3: T01 同页状态与 T02 删除(GREEN)
|
||||
|
||||
- [ ] 修改 `pages/tree/t01-tree-overview.vue`:加载后由状态和真实成员确定 `treeState`;画布、节点、信息条使用新位图;保留原有 T03/T04/T06/T07 跳转。
|
||||
- [ ] 从 `pages.json` 删除 `pages/tree/t02-tree-states`,删除 `pages/tree/t02-tree-states.vue`,移除 `data/page-catalog.js` 的 `t02`。
|
||||
- [ ] 运行新契约和运行冒烟转绿。
|
||||
|
||||
### Task 4: 收口
|
||||
|
||||
- [ ] 全量路由契约和 A03 路由计数更新为 54;当前文档同步 T02→T01 已完成、G06 仍待审美确认。
|
||||
- [ ] 截图并审视 T01 tree/landscape/empty/error、412×915 tree;运行全部静态契约、相关冒烟和 `git diff --check`。
|
||||
Reference in New Issue
Block a user