@aipper/aiws-spec 0.0.23 → 0.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/README.md +22 -0
  2. package/docs/aiws-bootstrap-routing-design.md +138 -0
  3. package/docs/aiws-governance-positioning.md +69 -0
  4. package/docs/cli-interface.md +87 -5
  5. package/docs/collaboration-artifacts.md +62 -0
  6. package/docs/opencode-omo-adapter.md +135 -0
  7. package/docs/opencode-omo-validation-checklist.md +90 -0
  8. package/docs/spec-contract.md +26 -11
  9. package/docs/superpowers-collaboration-adoption.md +92 -0
  10. package/docs/workflow-delegation-contracts.json +274 -0
  11. package/docs/workflow-delegation-contracts.md +248 -0
  12. package/docs/workflow-delegation-contracts.schema.json +176 -0
  13. package/docs/workflow-governance-rules.json +294 -0
  14. package/docs/workflow-governance-rules.md +63 -0
  15. package/docs/workflow-governance-rules.schema.json +182 -0
  16. package/docs/workflow-review-gates.json +72 -0
  17. package/docs/workflow-review-gates.md +36 -0
  18. package/docs/workflow-review-gates.schema.json +67 -0
  19. package/docs/workflow-router-rules.json +196 -0
  20. package/docs/workflow-router-rules.md +83 -0
  21. package/docs/workflow-router-rules.schema.json +119 -0
  22. package/docs/workflow-stage-contracts.json +148 -0
  23. package/docs/workflow-stage-contracts.md +70 -0
  24. package/docs/workflow-stage-contracts.schema.json +98 -0
  25. package/package.json +1 -1
  26. package/templates/workspace/.agents/skills/using-aiws/SKILL.md +83 -0
  27. package/templates/workspace/.agents/skills/ws-bugfix/SKILL.md +30 -7
  28. package/templates/workspace/.agents/skills/ws-commit/SKILL.md +26 -1
  29. package/templates/workspace/.agents/skills/ws-delegate/SKILL.md +75 -0
  30. package/templates/workspace/.agents/skills/ws-deliver/SKILL.md +46 -9
  31. package/templates/workspace/.agents/skills/ws-dev/SKILL.md +81 -11
  32. package/templates/workspace/.agents/skills/ws-finish/SKILL.md +101 -60
  33. package/templates/workspace/.agents/skills/ws-frontend-design/SKILL.md +126 -0
  34. package/templates/workspace/.agents/skills/ws-handoff/SKILL.md +22 -1
  35. package/templates/workspace/.agents/skills/ws-plan/SKILL.md +61 -2
  36. package/templates/workspace/.agents/skills/ws-plan-verify/SKILL.md +20 -0
  37. package/templates/workspace/.agents/skills/ws-preflight/SKILL.md +23 -0
  38. package/templates/workspace/.agents/skills/ws-quality-review/SKILL.md +56 -0
  39. package/templates/workspace/.agents/skills/ws-review/SKILL.md +24 -0
  40. package/templates/workspace/.agents/skills/ws-spec-review/SKILL.md +57 -0
  41. package/templates/workspace/.agents/skills/ws-verify-before-complete/SKILL.md +59 -0
  42. package/templates/workspace/.claude/commands/using-aiws.md +24 -0
  43. package/templates/workspace/.claude/commands/ws-bugfix.md +11 -6
  44. package/templates/workspace/.claude/commands/ws-commit.md +2 -1
  45. package/templates/workspace/.claude/commands/ws-deliver.md +6 -2
  46. package/templates/workspace/.claude/commands/ws-dev.md +5 -2
  47. package/templates/workspace/.claude/commands/ws-finish.md +19 -19
  48. package/templates/workspace/.claude/commands/ws-plan.md +9 -5
  49. package/templates/workspace/.claude/commands/ws-quality-review.md +24 -0
  50. package/templates/workspace/.claude/commands/ws-spec-review.md +24 -0
  51. package/templates/workspace/.claude/commands/ws-verify-before-complete.md +24 -0
  52. package/templates/workspace/.claude/skills/p-aiws-change-archive/SKILL.md +24 -0
  53. package/templates/workspace/.claude/skills/p-aiws-change-finish/SKILL.md +24 -0
  54. package/templates/workspace/.claude/skills/p-aiws-change-list/SKILL.md +18 -0
  55. package/templates/workspace/.claude/skills/p-aiws-change-new/SKILL.md +26 -0
  56. package/templates/workspace/.claude/skills/p-aiws-change-next/SKILL.md +19 -0
  57. package/templates/workspace/.claude/skills/p-aiws-change-start/SKILL.md +33 -0
  58. package/templates/workspace/.claude/skills/p-aiws-change-status/SKILL.md +19 -0
  59. package/templates/workspace/.claude/skills/p-aiws-change-sync/SKILL.md +19 -0
  60. package/templates/workspace/.claude/skills/p-aiws-change-templates-init/SKILL.md +18 -0
  61. package/templates/workspace/.claude/skills/p-aiws-change-templates-which/SKILL.md +18 -0
  62. package/templates/workspace/.claude/skills/p-aiws-change-validate/SKILL.md +23 -0
  63. package/templates/workspace/.claude/skills/p-aiws-hooks-install/SKILL.md +30 -0
  64. package/templates/workspace/.claude/skills/p-aiws-hooks-status/SKILL.md +18 -0
  65. package/templates/workspace/.claude/skills/p-aiws-init/SKILL.md +27 -0
  66. package/templates/workspace/.claude/skills/p-aiws-rollback/SKILL.md +18 -0
  67. package/templates/workspace/.claude/skills/p-aiws-update/SKILL.md +26 -0
  68. package/templates/workspace/.claude/skills/p-aiws-validate/SKILL.md +22 -0
  69. package/templates/workspace/.claude/skills/p-tasks-plan/SKILL.md +37 -0
  70. package/templates/workspace/.claude/skills/using-aiws/SKILL.md +83 -0
  71. package/templates/workspace/.claude/skills/ws-analyze/SKILL.md +26 -0
  72. package/templates/workspace/.claude/skills/ws-bugfix/SKILL.md +111 -0
  73. package/templates/workspace/.claude/skills/ws-commit/SKILL.md +127 -0
  74. package/templates/workspace/.claude/skills/ws-deliver/SKILL.md +231 -0
  75. package/templates/workspace/.claude/skills/ws-dev/SKILL.md +168 -0
  76. package/templates/workspace/.claude/skills/ws-finish/SKILL.md +220 -0
  77. package/templates/workspace/.claude/skills/ws-frontend-design/SKILL.md +126 -0
  78. package/templates/workspace/.claude/skills/ws-handoff/SKILL.md +52 -0
  79. package/templates/workspace/.claude/skills/ws-migrate/SKILL.md +54 -0
  80. package/templates/workspace/.claude/skills/ws-plan/SKILL.md +138 -0
  81. package/templates/workspace/.claude/skills/ws-plan-verify/SKILL.md +61 -0
  82. package/templates/workspace/.claude/skills/ws-preflight/SKILL.md +55 -0
  83. package/templates/workspace/.claude/skills/ws-pull/SKILL.md +119 -0
  84. package/templates/workspace/.claude/skills/ws-push/SKILL.md +110 -0
  85. package/templates/workspace/.claude/skills/ws-quality-review/SKILL.md +56 -0
  86. package/templates/workspace/.claude/skills/ws-req-change/SKILL.md +41 -0
  87. package/templates/workspace/.claude/skills/ws-req-contract-sync/SKILL.md +17 -0
  88. package/templates/workspace/.claude/skills/ws-req-contract-validate/SKILL.md +12 -0
  89. package/templates/workspace/.claude/skills/ws-req-flow-sync/SKILL.md +28 -0
  90. package/templates/workspace/.claude/skills/ws-req-review/SKILL.md +32 -0
  91. package/templates/workspace/.claude/skills/ws-review/SKILL.md +50 -0
  92. package/templates/workspace/.claude/skills/ws-rule/SKILL.md +23 -0
  93. package/templates/workspace/.claude/skills/ws-spec-review/SKILL.md +57 -0
  94. package/templates/workspace/.claude/skills/ws-submodule-setup/SKILL.md +65 -0
  95. package/templates/workspace/.claude/skills/ws-verify-before-complete/SKILL.md +59 -0
  96. package/templates/workspace/.codex/prompts/ws-dev.md +5 -1
  97. package/templates/workspace/.githooks/commit-msg +109 -0
  98. package/templates/workspace/.iflow/commands/ws-commit.toml +2 -1
  99. package/templates/workspace/.iflow/commands/ws-deliver.toml +6 -2
  100. package/templates/workspace/.iflow/commands/ws-finish.toml +19 -19
  101. package/templates/workspace/.opencode/command/using-aiws.md +29 -0
  102. package/templates/workspace/.opencode/command/ws-bugfix.md +11 -6
  103. package/templates/workspace/.opencode/command/ws-commit.md +2 -1
  104. package/templates/workspace/.opencode/command/ws-delegate.md +33 -0
  105. package/templates/workspace/.opencode/command/ws-deliver.md +6 -2
  106. package/templates/workspace/.opencode/command/ws-dev.md +5 -2
  107. package/templates/workspace/.opencode/command/ws-finish.md +19 -19
  108. package/templates/workspace/.opencode/command/ws-plan.md +12 -5
  109. package/templates/workspace/.opencode/command/ws-preflight.md +4 -0
  110. package/templates/workspace/.opencode/command/ws-quality-review.md +30 -0
  111. package/templates/workspace/.opencode/command/ws-review.md +3 -0
  112. package/templates/workspace/.opencode/command/ws-spec-review.md +30 -0
  113. package/templates/workspace/.opencode/command/ws-verify-before-complete.md +27 -0
  114. package/templates/workspace/.opencode/commands/p-aiws-change-archive.md +27 -0
  115. package/templates/workspace/.opencode/commands/p-aiws-change-finish.md +27 -0
  116. package/templates/workspace/.opencode/commands/p-aiws-change-list.md +26 -0
  117. package/templates/workspace/.opencode/commands/p-aiws-change-new.md +27 -0
  118. package/templates/workspace/.opencode/commands/p-aiws-change-next.md +27 -0
  119. package/templates/workspace/.opencode/commands/p-aiws-change-start.md +27 -0
  120. package/templates/workspace/.opencode/commands/p-aiws-change-status.md +27 -0
  121. package/templates/workspace/.opencode/commands/p-aiws-change-sync.md +27 -0
  122. package/templates/workspace/.opencode/commands/p-aiws-change-templates-init.md +26 -0
  123. package/templates/workspace/.opencode/commands/p-aiws-change-templates-which.md +26 -0
  124. package/templates/workspace/.opencode/commands/p-aiws-change-validate.md +27 -0
  125. package/templates/workspace/.opencode/commands/p-aiws-hooks-install.md +26 -0
  126. package/templates/workspace/.opencode/commands/p-aiws-hooks-status.md +26 -0
  127. package/templates/workspace/.opencode/commands/p-aiws-init.md +23 -0
  128. package/templates/workspace/.opencode/commands/p-aiws-rollback.md +16 -0
  129. package/templates/workspace/.opencode/commands/p-aiws-update.md +22 -0
  130. package/templates/workspace/.opencode/commands/p-aiws-validate.md +17 -0
  131. package/templates/workspace/.opencode/commands/using-aiws.md +29 -0
  132. package/templates/workspace/.opencode/commands/ws-analyze.md +30 -0
  133. package/templates/workspace/.opencode/commands/ws-bugfix.md +35 -0
  134. package/templates/workspace/.opencode/commands/ws-commit.md +70 -0
  135. package/templates/workspace/.opencode/commands/ws-delegate.md +33 -0
  136. package/templates/workspace/.opencode/commands/ws-deliver.md +58 -0
  137. package/templates/workspace/.opencode/commands/ws-dev.md +36 -0
  138. package/templates/workspace/.opencode/commands/ws-finish.md +71 -0
  139. package/templates/workspace/.opencode/commands/ws-handoff.md +25 -0
  140. package/templates/workspace/.opencode/commands/ws-migrate.md +25 -0
  141. package/templates/workspace/.opencode/commands/ws-plan-verify.md +28 -0
  142. package/templates/workspace/.opencode/commands/ws-plan.md +27 -0
  143. package/templates/workspace/.opencode/commands/ws-preflight.md +34 -0
  144. package/templates/workspace/.opencode/commands/ws-pull.md +87 -0
  145. package/templates/workspace/.opencode/commands/ws-push.md +93 -0
  146. package/templates/workspace/.opencode/commands/ws-quality-review.md +30 -0
  147. package/templates/workspace/.opencode/commands/ws-req-change.md +45 -0
  148. package/templates/workspace/.opencode/commands/ws-req-contract-sync.md +21 -0
  149. package/templates/workspace/.opencode/commands/ws-req-contract-validate.md +16 -0
  150. package/templates/workspace/.opencode/commands/ws-req-flow-sync.md +23 -0
  151. package/templates/workspace/.opencode/commands/ws-req-review.md +36 -0
  152. package/templates/workspace/.opencode/commands/ws-review.md +33 -0
  153. package/templates/workspace/.opencode/commands/ws-rule.md +27 -0
  154. package/templates/workspace/.opencode/commands/ws-spec-review.md +30 -0
  155. package/templates/workspace/.opencode/commands/ws-submodule-setup.md +57 -0
  156. package/templates/workspace/.opencode/commands/ws-verify-before-complete.md +27 -0
  157. package/templates/workspace/.opencode/oh-my-opencode.json.example +17 -0
  158. package/templates/workspace/.opencode/skills/p-aiws-change-archive/SKILL.md +24 -0
  159. package/templates/workspace/.opencode/skills/p-aiws-change-finish/SKILL.md +24 -0
  160. package/templates/workspace/.opencode/skills/p-aiws-change-list/SKILL.md +18 -0
  161. package/templates/workspace/.opencode/skills/p-aiws-change-new/SKILL.md +26 -0
  162. package/templates/workspace/.opencode/skills/p-aiws-change-next/SKILL.md +19 -0
  163. package/templates/workspace/.opencode/skills/p-aiws-change-start/SKILL.md +33 -0
  164. package/templates/workspace/.opencode/skills/p-aiws-change-status/SKILL.md +19 -0
  165. package/templates/workspace/.opencode/skills/p-aiws-change-sync/SKILL.md +19 -0
  166. package/templates/workspace/.opencode/skills/p-aiws-change-templates-init/SKILL.md +18 -0
  167. package/templates/workspace/.opencode/skills/p-aiws-change-templates-which/SKILL.md +18 -0
  168. package/templates/workspace/.opencode/skills/p-aiws-change-validate/SKILL.md +23 -0
  169. package/templates/workspace/.opencode/skills/p-aiws-hooks-install/SKILL.md +30 -0
  170. package/templates/workspace/.opencode/skills/p-aiws-hooks-status/SKILL.md +18 -0
  171. package/templates/workspace/.opencode/skills/p-aiws-init/SKILL.md +27 -0
  172. package/templates/workspace/.opencode/skills/p-aiws-rollback/SKILL.md +18 -0
  173. package/templates/workspace/.opencode/skills/p-aiws-update/SKILL.md +26 -0
  174. package/templates/workspace/.opencode/skills/p-aiws-validate/SKILL.md +22 -0
  175. package/templates/workspace/.opencode/skills/p-tasks-plan/SKILL.md +37 -0
  176. package/templates/workspace/.opencode/skills/using-aiws/SKILL.md +87 -0
  177. package/templates/workspace/.opencode/skills/ws-analyze/SKILL.md +26 -0
  178. package/templates/workspace/.opencode/skills/ws-bugfix/SKILL.md +111 -0
  179. package/templates/workspace/.opencode/skills/ws-commit/SKILL.md +127 -0
  180. package/templates/workspace/.opencode/skills/ws-delegate/SKILL.md +63 -0
  181. package/templates/workspace/.opencode/skills/ws-deliver/SKILL.md +231 -0
  182. package/templates/workspace/.opencode/skills/ws-dev/SKILL.md +168 -0
  183. package/templates/workspace/.opencode/skills/ws-finish/SKILL.md +220 -0
  184. package/templates/workspace/.opencode/skills/ws-frontend-design/SKILL.md +126 -0
  185. package/templates/workspace/.opencode/skills/ws-handoff/SKILL.md +52 -0
  186. package/templates/workspace/.opencode/skills/ws-migrate/SKILL.md +54 -0
  187. package/templates/workspace/.opencode/skills/ws-plan/SKILL.md +148 -0
  188. package/templates/workspace/.opencode/skills/ws-plan-verify/SKILL.md +61 -0
  189. package/templates/workspace/.opencode/skills/ws-preflight/SKILL.md +60 -0
  190. package/templates/workspace/.opencode/skills/ws-pull/SKILL.md +119 -0
  191. package/templates/workspace/.opencode/skills/ws-push/SKILL.md +110 -0
  192. package/templates/workspace/.opencode/skills/ws-quality-review/SKILL.md +63 -0
  193. package/templates/workspace/.opencode/skills/ws-req-change/SKILL.md +41 -0
  194. package/templates/workspace/.opencode/skills/ws-req-contract-sync/SKILL.md +17 -0
  195. package/templates/workspace/.opencode/skills/ws-req-contract-validate/SKILL.md +12 -0
  196. package/templates/workspace/.opencode/skills/ws-req-flow-sync/SKILL.md +28 -0
  197. package/templates/workspace/.opencode/skills/ws-req-review/SKILL.md +32 -0
  198. package/templates/workspace/.opencode/skills/ws-review/SKILL.md +57 -0
  199. package/templates/workspace/.opencode/skills/ws-rule/SKILL.md +23 -0
  200. package/templates/workspace/.opencode/skills/ws-spec-review/SKILL.md +64 -0
  201. package/templates/workspace/.opencode/skills/ws-submodule-setup/SKILL.md +65 -0
  202. package/templates/workspace/.opencode/skills/ws-verify-before-complete/SKILL.md +59 -0
  203. package/templates/workspace/AGENTS.md +72 -29
  204. package/templates/workspace/AI_WORKSPACE.md +4 -4
  205. package/templates/workspace/changes/README.md +26 -2
  206. package/templates/workspace/changes/templates/proposal.md +15 -0
  207. package/templates/workspace/changes/templates/tasks.md +9 -2
  208. package/templates/workspace/manifest.json +279 -2
  209. package/templates/workspace/tools/ws_change_check.py +27 -5
  210. package/templates/workspace/tools/ws_resolve_sub_target.sh +1 -0
@@ -7,13 +7,41 @@ description: 开发(按需求实现并验证;适用于任何需要修改代
7
7
 
8
8
  目标:在 AIWS 约束下完成一个可回放、可验证的小步交付。
9
9
 
10
+ 阶段定位:
11
+ - implementation 阶段;负责在既定计划/需求绑定下完成最小实现与验证。
12
+
13
+ 必需输入:
14
+ - 真值文件:`AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`
15
+ - 当前任务的归因目标(`Req_ID` 或 `Problem_ID`)
16
+ - 若为 medium/complex:已通过 `$ws-plan` / `$ws-plan-verify` 的计划
17
+ - 当前 `change/<change-id>` 上下文或等价变更归因
18
+
19
+ 必需输出:
20
+ - `变更文件(Changed):` 实际改动清单
21
+ - `验证(Verify):` 实际运行的命令与结果说明
22
+ - `证据(Evidence):` `plan/...`、`changes/<change-id>/...`、`.agentdocs/tmp/...` 等证据路径
23
+ - `Next:` 若准备提交,建议 `$ws-review` 或 `$ws-commit`
24
+
25
+ 阻断条件:
26
+ - 无法把改动归因到 `REQUIREMENTS.md` 或问题单
27
+ - 没有可复现验证入口
28
+ - 需要创建 change 上下文但当前工作区状态不允许安全切换
29
+
30
+ 完成判定:
31
+ - 改动已落盘、验证已执行或明确未执行原因、证据路径可回放,并可进入 review/commit 阶段。
32
+
10
33
  建议流程:
11
34
  1) 先做 preflight:定位项目根目录,读取 `AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`,输出约束摘要。
12
35
  - 若是中大型任务:建议先用 `$ws-plan` 生成 `plan/` 工件,再进入实现(便于可回放与对齐验证入口)。
13
36
  - 若已有 `plan/` 工件:先执行 `$ws-plan-verify`;通过后再进入实现(防止计划过长/跑偏)。
37
+ - 若 `$ws-plan` 刚创建了 `change/<change-id>` worktree:后续实现必须在该 worktree 中继续;不要回到原工作区重复 `aiws change start ...`
14
38
  2) 建立变更归因(推荐):
15
- - ⚠️ 开始前先确认工作区干净:`git status --porcelain` 为空;否则切分支/创建 worktree 后,未提交改动可能“看起来丢了”(worktree 只从 `HEAD` checkout,未提交内容会留在原目录)。
16
- - 强制(当你准备执行 `aiws change start ... --worktree/--switch` 创建新 change 时):先同步线上代码(含 submodules),避免基线过旧导致的 rebase/冲突与“别人已更新但本地没拉”的协作摩擦。
39
+ - ⚠️ 若你准备执行 `aiws change start ... --switch/--worktree` 或手工 `git switch ...` 改变 checkout 上下文,先确认工作区状态:`git status --porcelain`。否则切分支/创建 worktree 后,未提交改动可能看起来丢了(worktree 只从 `HEAD` checkout,未提交内容会留在原目录)。
40
+ - 若当前目录已经是 `change/<change-id>` worktree(例如由 `$ws-plan` 创建):直接在这里继续,不要再创建第二个 worktree,也不要回原工作区写代码。
41
+ - 若 `git status --porcelain` 非空仅因为上一轮 `$ws-plan` / `aiws change new|sync` 生成了 `plan/...`、`changes/<change-id>/proposal.md`、`tasks.md`、`design.md`、`submodules.targets`,这是预期行为,不等于流程出错。处理方式:
42
+ - 已经在 `change/<change-id>` 分支:直接继续实现,并把这些文件作为计划/证据工件保留。
43
+ - 还没进入 `change/<change-id>`:先运行 `aiws change start <change-id> --hooks --no-switch` 建立 change 上下文;若你仍要 `--switch/--worktree`,先提交这些规划工件,再切换上下文。
44
+ - 强制(当你准备执行 `aiws change start ... --worktree/--switch` 创建新 change 时):先同步线上代码(含 submodules),避免基线过旧导致的 rebase/冲突与别人已更新但本地没拉的协作摩擦。
17
45
  - 若你已经在 `change/<change-id>` 上继续开发:不要在此处强制 pull(避免把远端变动拉进变更分支);改为按需 `git fetch`/rebase,并保持门禁与验证可复现。
18
46
  - 在 AI 工具中运行:`$ws-pull`(推荐;会在工作区不干净时阻断)
19
47
  - 或等价手工(必须工作区干净;失败则停止并人工处理):
@@ -31,11 +59,15 @@ else
31
59
  fi
32
60
  ```
33
61
  - 推荐更安全(默认):`aiws change start <change-id> --hooks --no-switch`(只创建分支/工件 + 启用 hooks;不切分支)
34
- - 准备进入实现(且工作区干净)后再切换:`git switch change/<change-id>`
35
- - 若你明确要“一键切分支”(不推荐,且 dirty 会被拦截):`aiws change start <change-id> --hooks --switch`
62
+ - 准备进入实现时:若当前已在 `change/<change-id>` 直接继续;若需切换到该分支,先确认除规划工件外无额外未提交改动,再执行:`git switch change/<change-id>`
63
+ - 若你明确要一键切分支(不推荐,且 dirty 会被拦截):`aiws change start <change-id> --hooks --switch`
36
64
  - superproject + submodule(推荐):`aiws change start <change-id> --hooks --worktree --submodules`(创建独立 worktree;当前目录分支保持不变;会在新 worktree 内初始化 submodules;若忘了 `--submodules` 也会强制初始化)
37
65
  - 若后续需要在 detached submodule 内提交:先挂到 `aiws/pin/<target-branch>`;不要直接切 `change/<change-id>` / `main` / `master`
38
- - 若仓库存在 submodule(`.gitmodules` 声明了 submodule 条目):进入编码前必须准备好 `changes/<change-id>/submodules.targets`,并把每个 submodule 挂到对应的 `aiws/pin/<target_branch>`(必要时切到 `<remote>/<target_branch>`;这可能会改变 superproject 的 gitlink 指针,属于预期的“选渠道”行为;缺失该文件会被门禁阻断)
66
+ - 若仓库存在 submodule(`.gitmodules` 声明了 submodule 条目):进入编码前必须准备好 `changes/<change-id>/submodules.targets`,并把每个 submodule 挂到对应的 `aiws/pin/<target_branch>`(必要时切到 `<remote>/<target_branch>`;这可能会改变 superproject 的 gitlink 指针,属于预期的选渠道行为;缺失该文件会被门禁阻断)
67
+ - 允许用当前 submodule 状态来做默认预填,但必须显式说明来源,并最终落盘到 `submodules.targets`:
68
+ - detached HEAD:默认建议取 `.gitmodules` 中声明的 `submodule.<name>.branch`
69
+ - 已附着在某个本地分支:默认建议取该 submodule 的当前分支名
70
+ - 上述两条都只是建议值,不是运行时真值;真正的 finish/push 只认 `changes/<change-id>/submodules.targets`
39
71
  ```bash
40
72
  change_id="<change-id>"
41
73
  targets="changes/${change_id}/submodules.targets"
@@ -47,6 +79,7 @@ if [[ -f .gitmodules ]]; then
47
79
  fi
48
80
  if [[ "${has_submodules}" -eq 1 && ! -f "${targets}" ]]; then
49
81
  echo "error: missing ${targets} (required when .gitmodules declares submodules)"
82
+ echo "hint: create it first; defaults may be inferred, but the final truth must be written explicitly"
50
83
  exit 2
51
84
  fi
52
85
 
@@ -73,14 +106,50 @@ if [[ -f "${targets}" ]]; then
73
106
  # 检查 superproject 的 gitlink 是否发生变化(预期:若切了不同渠道,会看到差异)
74
107
  git diff --submodule
75
108
  fi
109
+ ```
110
+ - 若你还没写 `submodules.targets`,可按下面方式先生成建议值,再人工确认后落盘:
111
+ ```bash
112
+ change_id="<change-id>"
113
+ targets="changes/${change_id}/submodules.targets"
114
+ : > "${targets}"
115
+
116
+ git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' 2>/dev/null | while read -r key sub_path; do
117
+ name="${key#submodule.}"; name="${name%.path}"
118
+ current_branch="$(git -C "${sub_path}" branch --show-current 2>/dev/null || true)"
119
+ declared_branch="$(git config --file .gitmodules --get "submodule.${name}.branch" 2>/dev/null || true)"
120
+
121
+ if [[ -n "${current_branch}" ]]; then
122
+ inferred_branch="${current_branch}"
123
+ inferred_from="current branch"
124
+ else
125
+ inferred_branch="${declared_branch}"
126
+ inferred_from=".gitmodules"
127
+ fi
128
+
129
+ if [[ -z "${inferred_branch}" ]]; then
130
+ echo "error: cannot infer target branch for ${sub_path}; set it manually"
131
+ exit 2
132
+ fi
133
+
134
+ printf "%s %s\n" "${sub_path}" "${inferred_branch}" >> "${targets}"
135
+ echo "info: ${sub_path} -> ${inferred_branch} (inferred from ${inferred_from}; remote defaults to origin unless you edit ${targets})"
136
+ done
137
+
138
+ echo "review required: ${targets}"
139
+ cat "${targets}"
76
140
  ```
77
141
  - 若你明确要在 superproject 直接切分支:`aiws change start <change-id> --hooks --switch`(仅在存在 `.gitmodules` 时有意义;会尝试让 submodules 工作区跟随 superproject 指针)
78
142
  - 或手工:`git switch -c change/<change-id>`,并创建 `changes/<change-id>/proposal.md` 与 `changes/<change-id>/tasks.md`(参考 `changes/README.md`)
79
- 3) 如涉及需求调整:先做需求评审(可用 `$ws-req-review`)→ 用户确认后再做需求落盘(可用 `$ws-req-change`)(避免需求漂移)。
80
- 4) 实施最小改动:任何改动都要能归因到 `REQUIREMENTS.md`(验收)或 `issues/problem-issues.csv`(问题)。
81
- 5) 运行 `AI_WORKSPACE.md` 里声明的验证命令;未运行不声称已运行。
82
- 6) 多步任务(≥2 步):使用 `update_plan` 工具跟踪 `pending → in_progress → completed`,每完成一步立即更新(不要事后批量更新)。
83
- 7) 提交前强制门禁(commit/push hooks 也会阻断):
143
+ 3) 若需要外部 / agent 协作:
144
+ - 分析结论落盘到 `changes/<change-id>/analysis/`
145
+ - patch 草案落盘到 `changes/<change-id>/patches/`
146
+ - 不要把 `patches/` 当成“已应用代码”;主 agent 必须先审查再决定是否采用
147
+ - 若采用了委托结果,后续在 `ws-review` 或 `changes/<change-id>/review/` 中收敛最终结论
148
+ 4) 如涉及需求调整:先做需求评审(可用 `$ws-req-review`)→ 用户确认后再做需求落盘(可用 `$ws-req-change`)(避免需求漂移)。
149
+ 5) 实施最小改动:任何改动都要能归因到 `REQUIREMENTS.md`(验收)或 `issues/problem-issues.csv`(问题)。
150
+ 6) 运行 `AI_WORKSPACE.md` 里声明的验证命令;未运行不声称已运行。
151
+ 7) 多步任务(≥2 步):使用 `update_plan` 工具跟踪 `pending → in_progress → completed`,每完成一步立即更新(不要事后批量更新)。
152
+ 8) 提交前强制门禁(commit/push hooks 也会阻断):
84
153
  ```bash
85
154
  if [[ -x "./node_modules/.bin/aiws" ]]; then
86
155
  ./node_modules/.bin/aiws validate .
@@ -90,7 +159,8 @@ else
90
159
  npx @aipper/aiws validate .
91
160
  fi
92
161
  ```
93
- 8) 交付收尾(推荐,减少手动 merge 出错):运行 `$ws-finish`(底层调用 `aiws change finish`,默认 fast-forward 安全合并回目标分支)。
162
+ 9) 若使用了协同工件,交付前建议执行 `aiws change evidence <change-id>`,把 review / validate / collaboration summary 收敛到 `changes/<change-id>/evidence/`。
163
+ 10) 交付收尾(推荐,减少手动 merge 出错):运行 `$ws-finish`(底层调用 `aiws change finish`,默认 fast-forward 安全合并回目标分支)。
94
164
 
95
165
  输出要求:
96
166
  - `变更文件(Changed):` 文件清单
@@ -8,15 +8,39 @@ description: 收尾(门禁 + 安全合并 + submodule→主仓库顺序 push
8
8
  目标:
9
9
  - 在结束一次变更交付时,用 fast-forward 安全合并 `change/<change-id>` 回目标分支,减少手输分支名导致的错误
10
10
  - 合并成功后,按 `submodule -> superproject` 顺序 push,避免遗漏导致其它仓库拉取异常
11
- - 不自动删分支;push 前必须让用户确认
12
- - 若团队希望减少 submodule detached 的人为差异:建议在 `.gitmodules` 配置 `submodule.<name>.branch`,并在日常拉取时使用 `$ws-pull`
11
+ - 不自动删分支;AI 入口执行前应先向用户说明将要 push 的 remote/branch,显式传入 `--push` 即视为确认
12
+ - 若团队希望减少 submodule detached 的人为差异:建议在 `.gitmodules` 配置 `submodule.<name>.branch`,并在日常拉取时使用 `$ws-pull`
13
13
 
14
14
  前置(必须):
15
15
  - 工作区是干净的:`git status --porcelain` 无输出(若有未提交改动:先 commit 或 stash)
16
16
  - change 分支已存在:`change/<change-id>`(也支持 `changes/`、`ws/`、`ws-change/`)
17
- - 若使用 worktree:在“目标分支所在 worktree”执行(`aiws change finish` 会提示正确的 worktree)
17
+ - 若使用 worktree:在目标分支所在 worktree 执行(`aiws change finish` 会提示正确的 worktree)
18
18
  - 若存在 `.gitmodules`:必须为每个 submodule 配置 `submodule.<name>.branch`(否则无法确定性减少 detached;先运行 `$ws-submodule-setup` 并提交 `.gitmodules`)
19
19
 
20
+ 阶段定位:
21
+ - finish 阶段;负责把已提交的 change 安全合并回目标分支,并按约束完成 push / worktree cleanup。
22
+
23
+ 必需输入:
24
+ - 干净的当前工作区
25
+ - 已提交完成的 `change/<change-id>`
26
+ - 若存在 submodule:`.gitmodules` 与 `changes/<change-id>/submodules.targets`
27
+ - 当前 push 目标说明(remote / branch)
28
+
29
+ 必需输出:
30
+ - `Merge:` `aiws change finish` 的结果(from / into)
31
+ - `Push:` 实际 remote / branch 或未 push 原因
32
+ - `Worktree cleanup:` 清理结果
33
+ - `Evidence:` validate stamp / evidence / state 路径
34
+
35
+ 阻断条件:
36
+ - 工作区不干净
37
+ - 缺失 submodule branch / targets 真值
38
+ - fast-forward 失败
39
+ - 子模块目标分支无法安全 push
40
+
41
+ 完成判定:
42
+ - change 已安全合并回目标分支,必要的 push 与 worktree cleanup 已完成或明确说明未完成原因。
43
+
20
44
  建议步骤:
21
45
  0) 若存在 `.gitmodules`,先检查 submodule branch 配置是否齐全(缺失则停止并提示 setup):
22
46
  ```bash
@@ -61,23 +85,41 @@ fi
61
85
  ```bash
62
86
  aiws change state "${change_id}" --write
63
87
  ```
64
- 2) 安全合并(默认 fast-forward;并会在需要时切到目标分支):
88
+ 2) 若不存在 `.gitmodules`,或 submodules 已按顺序处理完成,优先直接使用最小收尾闭环:
65
89
  ```bash
66
90
  # 若当前就在 change/<change-id> 分支上,可省略 <change-id>
67
91
  change_id="<change-id>"
68
92
  if [[ -x "./node_modules/.bin/aiws" ]]; then
69
- ./node_modules/.bin/aiws change finish "${change_id}"
93
+ ./node_modules/.bin/aiws change finish "${change_id}" --push
70
94
  elif command -v aiws >/dev/null 2>&1; then
71
- aiws change finish "${change_id}"
95
+ aiws change finish "${change_id}" --push
72
96
  else
73
- npx @aipper/aiws change finish "${change_id}"
97
+ npx @aipper/aiws change finish "${change_id}" --push
74
98
  fi
75
99
  ```
76
- 3) 若 fast-forward 失败(提示需要 rebase):先在 change 分支(或对应 worktree)里 `git rebase <target-branch>`,再重试 `aiws change finish`。
77
- 4) 合并成功后,先把每个 submodule gitlink commit 合并回其目标分支(解决 detached HEAD),并按顺序 push:
100
+ 说明:
101
+ - 该命令会在 fast-forward 合并成功后 push 目标分支。
102
+ - 默认会优先使用当前分支的 upstream 配置(`branch.<name>.remote` + `branch.<name>.merge`);只有在你明确知道要推向别的 remote 时,才追加 `--remote <name>`。
103
+ - 若 `change/<change-id>` 位于独立 worktree,且该 worktree 干净,则会在 push 成功后自动执行 `git worktree remove` + `git worktree prune`。
104
+ - AI 工具内执行前,应先向用户说明将要 push 的 remote/branch;CLI 本身只有在显式传入 `--push` 时才会真正执行 push。
105
+
106
+ 3) 若你需要先处理 submodules,则不要依赖当前分支名推断目标分支,先显式解析 `base_branch`,再执行 submodule 步骤,最后回到主仓库执行 `aiws change finish --push`:
107
+ ```bash
108
+ change_id="<change-id>"
109
+ base_branch="$(python3 - <<'PY'
110
+ import json, pathlib
111
+ change_id = "<change-id>"
112
+ meta = pathlib.Path("changes") / change_id / ".ws-change.json"
113
+ data = json.loads(meta.read_text(encoding="utf-8"))
114
+ print((data.get("base_branch") or "").strip())
115
+ PY
116
+ )"
117
+ test -n "$base_branch"
118
+ ```
119
+ 4) 若 fast-forward 失败(提示需要 rebase):先在 change 分支(或对应 worktree)里 `git rebase <target-branch>`,再重试 `aiws change finish --push`。
120
+ 5) 若存在 `.gitmodules`,先把每个 submodule 的 gitlink commit 合并回其目标分支(解决 detached HEAD),并按顺序 push:
78
121
  ```bash
79
- # superproject 当前分支(finish 后通常是 base 分支)
80
- base_branch="$(git branch --show-current)"
122
+ # 不要用当前分支名代替目标分支;这里显式使用 .ws-change.json base_branch
81
123
  change_id="<change-id>"
82
124
  targets="changes/${change_id}/submodules.targets"
83
125
 
@@ -86,85 +128,84 @@ git config --file .gitmodules --get-regexp '^submodule\..*\.path$' 2>/dev/null |
86
128
 
87
129
  # 对每个 submodule.<name>.path <sub_path>:
88
130
  # 说明:`git submodule update` 会把 submodule checkout 到固定 gitlink commit,导致 detached HEAD。
89
- # 为减少“游离状态”的协作摩擦,本步骤采用“pin 分支”策略:
90
- # - 仅在 `.gitmodules` 明确配置了 `submodule.<name>.branch` 时执行(避免 origin 多分支导致误判)
91
- # - 不要直接切 `change/<change-id>` / `main` / `master` 等业务分支来“解 detached”
131
+ # 为减少游离状态的协作摩擦,本步骤采用 pin 分支策略:
132
+ # - `changes/<change-id>/submodules.targets` 是本次 finish/push 的真值;每个 submodule path 都必须在该文件中声明目标分支(可选 remote)
133
+ # - `.gitmodules` `submodule.<name>.branch` 仍建议保留,用于团队默认配置与校验,但不再作为 finish/push fallback
134
+ # - 生成/检查 `submodules.targets` 时可显式说明默认来源:
135
+ # - detached HEAD:默认建议取 `.gitmodules` 的 `submodule.<name>.branch`
136
+ # - 已附着在某个本地分支:默认建议取当前分支
137
+ # - 以上仅为预填建议;真正执行 finish/push 时仍只认 `submodules.targets`
138
+ # - 不要直接切 `change/<change-id>` / `main` / `master` 等业务分支来解 detached
92
139
  # - 不改动 submodule 现有分支指针(例如不强行移动 main/master)
93
140
  # - 创建/更新本地 pin 分支:`aiws/pin/<target_branch>` 指向 gitlink commit,并将其 upstream 设为 `origin/<target_branch>`
94
141
  if git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' >/dev/null 2>&1; then
95
- if [[ ! -f “${targets} ]]; then
96
- echo error: missing ${targets} (required when .gitmodules declares submodules)
142
+ if [[ ! -f "${targets}" ]]; then
143
+ echo "error: missing ${targets} (required when .gitmodules declares submodules)"
97
144
  exit 2
98
145
  fi
99
146
 
100
147
  source tools/ws_resolve_sub_target.sh
101
148
 
102
149
  while read -r key sub_path; do
103
- name=”${key#submodule.}”; name=”${name%.path}
104
- [[ -z “${sub_path:-} ]] && continue
105
- echo “== submodule: ${sub_path} (${name}) ==”
150
+ name="${key#submodule.}"; name="${name%.path}"
151
+ [[ -z "${sub_path:-}" ]] && continue
152
+ echo "== submodule: ${sub_path} (${name}) =="
153
+
154
+ current_branch="$(git -C "${sub_path}" branch --show-current 2>/dev/null || true)"
155
+ declared_branch="$(git config --file .gitmodules --get "submodule.${name}.branch" 2>/dev/null || true)"
156
+ if [[ -n "${current_branch}" ]]; then
157
+ echo "info: ${sub_path} default suggestion would be current branch: ${current_branch}"
158
+ elif [[ -n "${declared_branch}" ]]; then
159
+ echo "info: ${sub_path} default suggestion would be .gitmodules branch: ${declared_branch}"
160
+ else
161
+ echo "warn: ${sub_path} has no current branch and no .gitmodules branch; submodules.targets must be filled manually"
162
+ fi
106
163
 
107
- sub_sha=”$(git rev-parse HEAD:${sub_path})
164
+ sub_sha="$(git rev-parse "HEAD:${sub_path}")"
108
165
 
109
- ws_resolve_sub_target “${sub_path} “${name} “${targets} “${base_branch} || exit 2
110
- target_branch=”${_resolved_branch}
111
- remote=”${_resolved_remote}
112
- pin_branch=”aiws/pin/${target_branch}
166
+ ws_resolve_sub_target "${sub_path}" "${name}" "${targets}" "${base_branch}" || exit 2
167
+ target_branch="${_resolved_branch}"
168
+ remote="${_resolved_remote}"
169
+ pin_branch="aiws/pin/${target_branch}"
113
170
 
114
- git -C “${sub_path} fetch “${remote} --prune
115
- if ! git -C “${sub_path} show-ref --verify --quiet refs/remotes/${remote}/${target_branch}”; then
116
- echo error: ${sub_path}: missing ${remote}/${target_branch}; refusing to push superproject (would break gitlink fetchability)
171
+ git -C "${sub_path}" fetch "${remote}" --prune
172
+ if ! git -C "${sub_path}" show-ref --verify --quiet "refs/remotes/${remote}/${target_branch}"; then
173
+ echo "error: ${sub_path}: missing ${remote}/${target_branch}; refusing to push superproject (would break gitlink fetchability)"
117
174
  exit 2
118
175
  fi
119
176
 
120
- # 仅当 gitlink commit 属于 <remote>/<target_branch> 的历史时才”挂回分支”
121
- if ! git -C “${sub_path} merge-base --is-ancestor “${sub_sha} “${remote}/${target_branch}”; then
122
- echo [warn] ${sub_path}: ${sub_sha} is not in ${remote}/${target_branch}; keep detached and stop (need manual reconcile)
177
+ # 仅当 gitlink commit 属于 <remote>/<target_branch> 的历史时才挂回分支
178
+ if ! git -C "${sub_path}" merge-base --is-ancestor "${sub_sha}" "${remote}/${target_branch}"; then
179
+ echo "[warn] ${sub_path}: ${sub_sha} is not in ${remote}/${target_branch}; keep detached and stop (need manual reconcile)"
123
180
  exit 1
124
181
  fi
125
182
 
126
- git -C “${sub_path} checkout -B “${pin_branch} “${sub_sha}
127
- git -C “${sub_path} branch --set-upstream-to “${remote}/${target_branch} “${pin_branch} >/dev/null 2>&1 || true
128
- git -C “${sub_path} status -sb
183
+ git -C "${sub_path}" checkout -B "${pin_branch}" "${sub_sha}"
184
+ git -C "${sub_path}" branch --set-upstream-to "${remote}/${target_branch}" "${pin_branch}" >/dev/null 2>&1 || true
185
+ git -C "${sub_path}" status -sb
129
186
 
130
187
  # push:只允许 fast-forward(若远端分叉会被拒绝;此时必须人工处理)
131
- git -C “${sub_path} push “${remote} “${sub_sha}:refs/heads/${target_branch}
188
+ git -C "${sub_path}" push "${remote}" "${sub_sha}:refs/heads/${target_branch}"
132
189
  done < <(git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' 2>/dev/null || true)
133
190
  fi
134
191
  ```
135
192
  规则:
136
- - 每个 submodule 必须先执行“pin 分支挂回 + fast-forward push”,再 push 主仓库。
193
+ - 每个 submodule 必须先执行 pin 分支挂回 + fast-forward push,再 push 主仓库。
137
194
  - 若任一 submodule 的 gitlink commit 不在 `<remote>/<target_branch>` 历史中:立即停止,先人工处理分叉,再继续。
138
195
 
139
- 5) 仅当 submodules 全部成功后,再 push superproject 当前分支:
140
- ```bash
141
- git branch --show-current
142
- git status -sb
143
- git push
144
- ```
145
- 6) push 成功后,清理 `change/<change-id>` 对应 worktree(若存在且不是当前 worktree):
196
+ 6) 仅当 submodules 全部成功后,再在 superproject 当前分支执行最小收尾闭环:
146
197
  ```bash
147
198
  change_id="<change-id>"
148
- change_ref="refs/heads/change/${change_id}"
149
- main_wt="$(git rev-parse --show-toplevel)"
150
- change_wt="$(git worktree list --porcelain | awk -v ref="$change_ref" '
151
- $1=="worktree" { wt=substr($0,10) }
152
- $1=="branch" && $2==ref { print wt; exit }
153
- ')"
154
-
155
- if [[ -n "${change_wt:-}" && "$change_wt" != "$main_wt" ]]; then
156
- if [[ -n "$(git -C "$change_wt" status --porcelain 2>/dev/null)" ]]; then
157
- echo "[warn] worktree not clean, skip remove: $change_wt"
158
- echo "hint: clean it first, then run: git worktree remove \"$change_wt\""
159
- else
160
- git worktree remove "$change_wt"
161
- git worktree prune
162
- fi
199
+ if [[ -x "./node_modules/.bin/aiws" ]]; then
200
+ ./node_modules/.bin/aiws change finish "${change_id}" --push
201
+ elif command -v aiws >/dev/null 2>&1; then
202
+ aiws change finish "${change_id}" --push
203
+ else
204
+ npx @aipper/aiws change finish "${change_id}" --push
163
205
  fi
164
206
  ```
165
- 规则:
166
- - 清理前先把 `change_wt` 输出给用户确认,避免误删。
167
- - 仅使用 `git worktree remove`(不带 `--force`)。
207
+ 说明:
208
+ - 该命令内部已经包含主仓库 push 成功后安全清理独立 change worktree 的逻辑。
168
209
 
169
210
  7) (可选)归档变更工件(完成交付后推荐):
170
211
  ```bash
@@ -0,0 +1,126 @@
1
+ ---
2
+ name: ws-frontend-design
3
+ description: 前端设计实现(用于视觉型 landing page / 网站 / 应用界面 / demo / prototype;强调构图、层级、图像、动效与克制,不做通用卡片墙)
4
+ ---
5
+
6
+ 用中文输出(命令/路径/代码标识符保持原样不翻译)。
7
+
8
+ 目标:
9
+ - 在 AIWS 约束下交付一个可运行、可验证、视觉方向明确的前端界面
10
+ - 先做信息层级与构图,再做组件细节;避免“先堆卡片再补样式”
11
+ - 在品牌页与产品页之间做正确取舍:品牌页重视觉锚点,产品页重可操作性
12
+
13
+ 非目标(强制):
14
+ - 不绕过 `$ws-preflight`、`REQUIREMENTS.md`、`AI_WORKSPACE.md`
15
+ - 不因为“追求设计感”而重写无关页面、改动无关设计系统或新增大面积依赖
16
+ - 不默认把已有产品后台改成营销页;dashboard / admin / workspace 优先 utility copy
17
+ - 不把 prompt 语言、设计说明、占位废话直接写进 UI
18
+
19
+ 适用场景:
20
+ - 用户要做 landing page、品牌站、活动页、marketing 页面、demo、prototype、game UI
21
+ - 用户要把现有前端界面做成“视觉主导、层级清晰、记忆点强”的版本
22
+ - 用户明确要求美化、重做、提质、增强 art direction / hierarchy / motion
23
+
24
+ 前置(建议顺序):
25
+ 1) 先运行 `$ws-preflight`。
26
+ 2) 判断任务类型(必须选一个):
27
+ - `landing`:品牌/营销/活动页
28
+ - `app-ui`:dashboard / admin / workspace / 工具界面
29
+ - `polish-only`:不改信息架构,只做视觉提质
30
+ 3) 判断设计边界(必须说明):
31
+ - `net-new`:全新页面,可建立完整视觉语言
32
+ - `existing-system`:已有设计系统/品牌规范,优先复用
33
+ 4) 若任务达到 medium / complex:先用 `$ws-plan` 落盘计划,再进入实现。
34
+
35
+ 开始编码前,先写三项(不要跳过):
36
+ - `Visual thesis:` 一句话写清 mood / material / energy
37
+ - `Content plan:` `hero -> support -> detail -> final CTA`(若是 app-ui,则改为 `workspace -> nav -> context -> action`)
38
+ - `Interaction thesis:` 2-3 个动效想法;说明它们如何改善层级/氛围/可感知性
39
+
40
+ 设计默认值:
41
+ - 从构图开始,不从组件库开始
42
+ - 第一屏优先做成海报感(poster),不是文档感(document)
43
+ - 默认先找一个强视觉锚点:大图、主视觉平面、关键产品画面、主数据工作区
44
+ - 默认不做卡片墙;优先 section、column、divider、media block、list、plain layout
45
+ - 默认最多两套字体、一种强调色;若已有品牌系统,优先跟随现有 token
46
+ - 优先靠留白、尺度、裁切、对比、对齐建立层级,再考虑装饰
47
+
48
+ landing 规则:
49
+ 1) 默认结构:
50
+ - Hero:品牌/产品名、承诺、CTA、一个主视觉
51
+ - Support:一个具体能力 / 证明点 / offer
52
+ - Detail:氛围、流程、产品深度或故事
53
+ - Final CTA:开始、注册、联系、访问
54
+ 2) Hero 强约束:
55
+ - 一个 section 只承载一个 dominant idea
56
+ - 默认使用 full-bleed hero;只有内层文字列需要约束宽度
57
+ - 品牌名优先级高于 headline;headline 高于 body;body 高于 CTA
58
+ - 默认不要 hero cards、stat strips、logo clouds、pill soup、floating dashboards
59
+ - headline 在 desktop 约 2-3 行;mobile 一眼读完
60
+ - 若有固定 header,它占用首屏预算;不要让 header + hero 超出初始 viewport
61
+ - 若去掉主视觉后首屏仍几乎成立,说明图像太弱
62
+
63
+ app-ui 规则:
64
+ - 默认偏克制:少颜色、少 chrome、清晰栅格、密度适中、信息可扫读
65
+ - 优先组织为:`primary workspace -> navigation -> secondary context/inspector -> action`
66
+ - 只有当 card 本身就是交互容器时才用 card;否则尽量改回 plain layout
67
+ - 不要把 routine product UI 做成营销落地页
68
+ - 文案优先 orientation / status / action:
69
+ - 好例子:`Selected KPIs`、`Plan status`、`Last sync`
70
+ - 差例子:首页口号、情绪化隐喻、执行摘要横幅
71
+
72
+ 图像与媒体:
73
+ - 图像必须承担叙事任务,不能只是补背景
74
+ - 品牌页/空间页/生活方式产品优先真实感强的图,而不是抽象 3D / 假 dashboard
75
+ - 选图时优先有稳定明暗区,便于文字落位
76
+ - 避免图里自带抢戏的 logo、signage、碎字、边框 UI
77
+ - 若需要多个场景,优先多张图,不要拼贴大杂烩
78
+
79
+ 文案:
80
+ - 用产品语言,不用设计评论语言
81
+ - headline 负责主要意义;supporting copy 通常一句话够了
82
+ - 每个 section 只负责一件事:explain / prove / deepen / convert
83
+ - 如果删掉 30% 文案后更清楚,就继续删
84
+
85
+ 动效:
86
+ - 视觉型页面至少给 2-3 个“有感但克制”的动效:
87
+ - 一个 hero 入场序列
88
+ - 一个 scroll-linked / sticky / depth 效果
89
+ - 一个 hover / reveal / layout transition
90
+ - 动效必须改善层级或氛围,不能只是热闹
91
+ - 要兼顾 mobile 流畅度;支持 `prefers-reduced-motion`
92
+
93
+ 工程约束(强制):
94
+ - 先读现有代码,再决定是否沿用已有 design tokens / 组件 / 动效库
95
+ - `existing-system` 场景下,优先复用已有视觉语言;不要无故“整站改头换面”
96
+ - 不新增字体、图片资源、动画库、运行时依赖,除非明确写出原因、来源、license/成本与回滚方式
97
+ - 所有文字覆盖在图像上时,必须保证对比度与点击区域可用
98
+ - 必须同时考虑 desktop / mobile;不要只调一个 viewport
99
+ - 未运行不声称已运行;验证命令优先引用 `AI_WORKSPACE.md`
100
+
101
+ 硬规则:
102
+ - No cards by default
103
+ - No hero cards by default
104
+ - No generic SaaS card grid as first impression
105
+ - No more than one dominant idea per section
106
+ - No more than two typefaces without a clear reason
107
+ - No more than one accent color unless the existing product already has a strong system
108
+ - No decorative gradients behind routine product UI
109
+ - No busy imagery behind text
110
+ - No filler copy
111
+
112
+ 实现检查(交付前自检):
113
+ - 第一屏能否一眼看出品牌/产品是什么
114
+ - 是否存在一个明确视觉锚点
115
+ - 只扫标题是否能理解页面
116
+ - 每个 section 是否只有一个职责
117
+ - card 是否真有必要
118
+ - 动效是否真的提升层级/氛围
119
+ - 去掉装饰阴影后,页面是否仍然成立
120
+
121
+ 输出要求:
122
+ - `Mode:` `landing | app-ui | polish-only`
123
+ - `Visual thesis:` 一句话
124
+ - `Changed:` 改动文件清单
125
+ - `Verify:` 实际运行命令 + 预期结果
126
+ - `Evidence:` 相关 `plan/...`、`changes/<change-id>/...` 或截图/审计路径
@@ -7,12 +7,33 @@ description: 交接(归档后生成/查看 changes/archive/.../handoff.md)
7
7
 
8
8
  目标:
9
9
  - 让 change 的交接信息可回放:`handoff.md`(包含:本次完成/改动文件/关键决策/下一步建议/绑定)
10
+ - 若存在协同工件:在 handoff 中一并概述 `analysis/`、`patches/`、`review/`、`evidence/`
10
11
  - 指引在归档与依赖场景下如何使用 handoff
11
12
 
12
13
  说明:
13
14
  - `handoff.md` 由 `aiws change archive` 自动生成:`changes/archive/<date>-<change-id>/handoff.md`
14
15
  - `Depends_On` 依赖若已归档,`aiws change start` 会尝试读取依赖的 `handoff.md` 并输出摘要
15
16
 
17
+ 阶段定位:
18
+ - handoff / archive 阶段;负责把已完成 change 的上下文压缩成后续协作者可直接接手的说明。
19
+
20
+ 必需输入:
21
+ - 当前或已归档的 `change/<change-id>`
22
+ - 对应 archive 目录或准备归档的 change 工件
23
+
24
+ 必需输出:
25
+ - `Change_ID:` 当前交接对象
26
+ - `Handoff:` `changes/archive/.../handoff.md`
27
+ - `Next:` 推荐后续 change / `Depends_On` 关系
28
+
29
+ 阻断条件:
30
+ - 无法定位目标 change
31
+ - 未归档且无法执行 `aiws change archive <change-id>`
32
+ - `handoff.md` 无法生成或读取
33
+
34
+ 完成判定:
35
+ - 下一位协作者可以只依赖 `handoff.md` 和绑定信息继续工作,而不需要回溯整段会话。
36
+
16
37
  执行建议:
17
38
  1) 先运行 `$ws-preflight`。
18
39
  2) 若本 change 已完成并准备归档:运行 `aiws change archive <change-id>`(会先做严格校验,并移动目录到 `changes/archive/`,同时生成 `handoff.md`)。
@@ -23,9 +44,9 @@ ls -1 changes/archive/*-"${change_id}"/handoff.md
23
44
  sed -n '1,160p' changes/archive/*-"${change_id}"/handoff.md
24
45
  ```
25
46
  4) 若要让后续 change 可接力:在 `proposal.md` 里声明 `Blocks`(下一步建议会据此生成)。
47
+ 5) 若本 change 使用了外部 / 子 agent 协作:确认关键结论已经进入 `review/` 或 `evidence/`,避免 handoff 只留下原始 patch/分析文件而没有最终结论。
26
48
 
27
49
  输出要求:
28
50
  - `Change_ID:` <change-id>
29
51
  - `Handoff:` `changes/archive/.../handoff.md`
30
52
  - `Next:` 若还有后续工作,建议创建新 change 并在其 `Depends_On` 引用本 change
31
-
@@ -7,6 +7,7 @@ description: 规划(生成可落盘 plan/ 工件;供 ws-dev 执行)
7
7
 
8
8
  目标:
9
9
  - 对齐真值文件(`AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`)
10
+ - 若尚未进入本次 change 的工作上下文:先建立 `change/<change-id>` 分支 / worktree,再生成计划
10
11
  - 为当前任务生成一份可追踪的执行计划文件:`plan/<timestamp>-<slug>.md`
11
12
  - 计划必须包含可复现验证命令(优先引用 `AI_WORKSPACE.md`)
12
13
  - 计划必须包含“主索引绑定”:`Change_ID` / (`Req_ID` or `Problem_ID`) / `Contract_Row` / `Plan_File` / `Evidence_Path`
@@ -17,22 +18,79 @@ description: 规划(生成可落盘 plan/ 工件;供 ws-dev 执行)
17
18
  - 未运行不声称已运行;验证命令要写清“预期结果”
18
19
  - 若存在 `changes/<change-id>/proposal.md`,计划与 proposal 的绑定字段必须保持一致(不一致时先修正再继续)
19
20
 
21
+ 阶段定位:
22
+ - planning 阶段;负责把用户目标收敛为 change 绑定、计划文件和验证入口。
23
+
24
+ 必需输入:
25
+ - 当前任务描述
26
+ - 真值文件:`AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`
27
+ - 若已存在:`changes/<change-id>/proposal.md`
28
+ - 若已有计划:当前 `plan/...` 文件
29
+
30
+ 必需输出:
31
+ - `Plan file:` 实际写入的 `plan/...`
32
+ - `Change context:` 当前生效的 `change/<change-id>` 分支或 worktree
33
+ - `Bindings:` `Change_ID` / `Req_ID|Problem_ID` / `Contract_Row` / `Plan_File` / `Evidence_Path`
34
+ - `Verify:` 可复现验证命令与预期
35
+ - `Next:` 先 `$ws-plan-verify`,通过后再 `$ws-dev`
36
+
37
+ 阻断条件:
38
+ - 任务目标或归因绑定不清晰
39
+ - 当前工作区 dirty 且尚未进入可复用的 change 上下文
40
+ - 无法把计划实际写盘
41
+
42
+ 完成判定:
43
+ - 计划已落盘、绑定已同步、验证入口明确,后续实现可以直接按计划推进。
44
+
20
45
  执行步骤(建议):
21
46
  1) 先运行 `$ws-preflight`(读取真值文件并输出约束摘要)。
22
47
  2) 若用户任务描述不清:先问 1-3 个关键澄清问题(不要猜)。
23
48
  3) 判断复杂度:`simple / medium / complex`(给出一句理由),并估算步骤数。
24
- 4) 识别主索引上下文(若存在):
49
+ 4) 识别或建立主索引 / change 上下文:
25
50
  - 若存在 `changes/<change-id>/proposal.md`:读取其中 `Change_ID` / `Req_ID` / `Problem_ID` / `Contract_Row` / `Evidence_Path`
26
51
  - 若缺失关键绑定:先补齐 proposal(至少 `Change_ID`、`Req_ID|Problem_ID`、`Contract_Row`)再继续生成计划
52
+ - 若当前不在 `change/<change-id>` 分支 / worktree,且本次任务需要新建 change:先调用 `aiws change start` 建立上下文,再继续写 plan
53
+ - 推荐顺序:
54
+ - 工作区已存在未提交改动:不要先写 `plan/...`;先停下来说明原因,并要求用户先 commit/stash,或改用已有 change 上下文
55
+ - 仓库已有提交:优先创建独立 worktree;若仓库声明了 submodules,加上 `--submodules`
56
+ - 仓库尚无提交 / 不满足 worktree 前置条件:回退为 `--no-switch`
57
+ ```bash
58
+ change_id="<change-id>"
59
+ if [[ -n "$(git status --porcelain)" ]]; then
60
+ echo "error: working tree dirty before ws-plan creates change context"
61
+ echo "hint: commit/stash first, or continue inside an existing change/<change-id> context"
62
+ exit 2
63
+ fi
64
+
65
+ has_commits=0
66
+ git rev-parse --verify HEAD >/dev/null 2>&1 && has_commits=1
67
+
68
+ has_submodules=0
69
+ if [[ -f .gitmodules ]] && git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' >/dev/null 2>&1; then
70
+ has_submodules=1
71
+ fi
72
+
73
+ if [[ "${has_commits}" -eq 1 ]]; then
74
+ if [[ "${has_submodules}" -eq 1 ]]; then
75
+ aiws change start "${change_id}" --hooks --worktree --submodules
76
+ else
77
+ aiws change start "${change_id}" --hooks --worktree
78
+ fi
79
+ else
80
+ aiws change start "${change_id}" --hooks --no-switch
81
+ fi
82
+ ```
83
+ - 若上一步创建了 worktree:后续所有读取/写入都必须切到 `aiws change start` 输出的 `worktree:` 路径中进行;不要把 `plan/...` 写回原工作区
27
84
  5) 生成计划文件:
28
85
  - 文件名:`plan/YYYY-MM-DD_HH-MM-SS-<slug>.md`(`<slug>` 用 kebab-case;同一任务调整计划时尽量复用同一文件)
29
86
  - 若 `plan/` 不存在先创建
30
87
  - 必须实际写入到磁盘(不要只在对话里输出);如因权限/策略无法写盘,必须明确说明原因并输出可复制的完整内容
88
+ - 计划必须写在当前 active change 上下文内:若当前已进入 `change/<change-id>` worktree,则 `plan/...`、`proposal.md`、`tasks.md` 都应写在该 worktree 中
31
89
  6) 计划内容至少包含(不要留空):
32
90
  - `Bindings`:`Change_ID` / `Req_ID` / `Problem_ID` / `Contract_Row` / `Plan_File` / `Evidence_Path`
33
91
  - `Goal`:要达成什么
34
92
  - `Non-goals`:明确不做什么(避免 scope creep)
35
- - `Scope`:将改动的文件/目录清单(不确定就写 `TBD` 并说明如何确定)
93
+ - `Scope`:默认写成 `## Scope` 或 `## 影响范围(Scope)`,并包含 `### In Scope` / `### Out of Scope`;`In Scope` 下列出允许修改的文件/目录清单(支持 glob,不确定就写 `TBD` 并说明如何确定)
36
94
  - `Plan`:分步执行(每步尽量落到具体文件/命令;必要时拆 Phase)
37
95
  - `Submodules`(当存在 `.gitmodules` 且声明了 submodule 条目时,强制):声明“本次 change 的 submodule 目标分支真值”(用于同一 superproject 分支内的多渠道交付;也避免仅靠 `.gitmodules` 默认分支导致交付推送到错误分支)
38
96
  - `Verify`:可复现命令 + 期望结果(优先引用 `AI_WORKSPACE.md` 的入口;必要时补充 e2e)
@@ -76,4 +134,5 @@ echo "ok: wrote ${targets}"
76
134
 
77
135
  输出要求:
78
136
  - `Plan file:` <实际写入的路径>
137
+ - `Change context:` <当前 change 分支或 worktree 路径;若新建了 worktree 需明确写出>
79
138
  - `Next:` 推荐下一步(先 `$ws-plan-verify`,通过后再 `$ws-dev`;或 `aiws change start <change-id> --hooks`,superproject + submodule 可用 `--worktree`)