@aipper/aiws-spec 0.0.28 → 0.0.29

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 (101) hide show
  1. package/docs/cli-interface.md +10 -12
  2. package/docs/opencode-autonomous-swarm.md +178 -0
  3. package/docs/opencode-omo-adapter.md +123 -4
  4. package/docs/opencode-omo-validation-checklist.md +47 -0
  5. package/docs/opencode-subagent-first.md +187 -0
  6. package/docs/workflow-delegation-context-injection.md +217 -0
  7. package/docs/workflow-delegation-contracts.json +68 -1
  8. package/docs/workflow-delegation-contracts.md +3 -0
  9. package/docs/workflow-delegation-contracts.schema.json +95 -0
  10. package/docs/workflow-governance-rules.json +47 -6
  11. package/docs/workflow-governance-rules.md +7 -6
  12. package/docs/workflow-governance-rules.schema.json +39 -1
  13. package/docs/workflow-router-rules.json +36 -4
  14. package/docs/workflow-router-rules.md +8 -4
  15. package/docs/workflow-stage-contracts.json +2 -3
  16. package/docs/workflow-stage-contracts.md +2 -3
  17. package/package.json +1 -1
  18. package/templates/workspace/.agents/skills/using-aiws/SKILL.md +8 -6
  19. package/templates/workspace/.agents/skills/ws-commit/SKILL.md +6 -118
  20. package/templates/workspace/.agents/skills/ws-deliver/SKILL.md +6 -218
  21. package/templates/workspace/.agents/skills/ws-dev/SKILL.md +52 -141
  22. package/templates/workspace/.agents/skills/ws-finish/SKILL.md +6 -205
  23. package/templates/workspace/.agents/skills/ws-handoff/SKILL.md +10 -44
  24. package/templates/workspace/.agents/skills/ws-plan-verify/SKILL.md +6 -58
  25. package/templates/workspace/.agents/skills/ws-review/SKILL.md +6 -1
  26. package/templates/workspace/.agents/skills/ws-verify-before-complete/SKILL.md +12 -53
  27. package/templates/workspace/.claude/commands/ws-review.md +5 -1
  28. package/templates/workspace/.claude/settings.json.example +26 -0
  29. package/templates/workspace/.claude/skills/ws-commit/SKILL.md +6 -118
  30. package/templates/workspace/.claude/skills/ws-deliver/SKILL.md +6 -218
  31. package/templates/workspace/.claude/skills/ws-dev/SKILL.md +52 -141
  32. package/templates/workspace/.claude/skills/ws-finish/SKILL.md +6 -205
  33. package/templates/workspace/.claude/skills/ws-handoff/SKILL.md +10 -44
  34. package/templates/workspace/.claude/skills/ws-plan-verify/SKILL.md +6 -49
  35. package/templates/workspace/.claude/skills/ws-review/SKILL.md +6 -1
  36. package/templates/workspace/.claude/skills/ws-verify-before-complete/SKILL.md +12 -53
  37. package/templates/workspace/.opencode/command/ws-auto.md +33 -0
  38. package/templates/workspace/.opencode/command/ws-autonomy.md +25 -0
  39. package/templates/workspace/.opencode/command/ws-review.md +5 -1
  40. package/templates/workspace/.opencode/commands/ws-auto.md +33 -0
  41. package/templates/workspace/.opencode/commands/ws-autonomy.md +25 -0
  42. package/templates/workspace/.opencode/commands/ws-commit.md +4 -56
  43. package/templates/workspace/.opencode/commands/ws-deliver.md +10 -50
  44. package/templates/workspace/.opencode/commands/ws-finish.md +8 -65
  45. package/templates/workspace/.opencode/commands/ws-handoff.md +9 -17
  46. package/templates/workspace/.opencode/commands/ws-migrate.md +10 -17
  47. package/templates/workspace/.opencode/commands/ws-plan-verify.md +5 -15
  48. package/templates/workspace/.opencode/commands/ws-pull.md +6 -75
  49. package/templates/workspace/.opencode/commands/ws-push.md +7 -82
  50. package/templates/workspace/.opencode/commands/ws-review.md +5 -1
  51. package/templates/workspace/.opencode/commands/ws-submodule-setup.md +8 -47
  52. package/templates/workspace/.opencode/commands/ws-verify-before-complete.md +10 -19
  53. package/templates/workspace/.opencode/helpers/approval-whitelist-check.sh +148 -0
  54. package/templates/workspace/.opencode/helpers/approval-whitelist-run.sh +82 -0
  55. package/templates/workspace/.opencode/helpers/approval-whitelist-watchdog.sh +144 -0
  56. package/templates/workspace/.opencode/helpers/tmux-swarm-rescue.sh +56 -0
  57. package/templates/workspace/.opencode/helpers/tmux-swarm-scan.sh +46 -0
  58. package/templates/workspace/.opencode/oh-my-opencode.json.example +64 -4
  59. package/templates/workspace/.opencode/skills/using-aiws/SKILL.md +93 -77
  60. package/templates/workspace/.opencode/skills/ws-analyze/SKILL.md +1 -1
  61. package/templates/workspace/.opencode/skills/ws-auto/SKILL.md +46 -0
  62. package/templates/workspace/.opencode/skills/ws-autonomy/SKILL.md +62 -0
  63. package/templates/workspace/.opencode/skills/ws-bugfix/SKILL.md +1 -1
  64. package/templates/workspace/.opencode/skills/ws-commit/SKILL.md +6 -118
  65. package/templates/workspace/.opencode/skills/ws-delegate/SKILL.md +93 -40
  66. package/templates/workspace/.opencode/skills/ws-deliver/SKILL.md +6 -218
  67. package/templates/workspace/.opencode/skills/ws-dev/SKILL.md +53 -142
  68. package/templates/workspace/.opencode/skills/ws-dev-lite/SKILL.md +19 -6
  69. package/templates/workspace/.opencode/skills/ws-finish/SKILL.md +6 -205
  70. package/templates/workspace/.opencode/skills/ws-frontend-design/SKILL.md +1 -1
  71. package/templates/workspace/.opencode/skills/ws-handoff/SKILL.md +10 -44
  72. package/templates/workspace/.opencode/skills/ws-intake/SKILL.md +11 -2
  73. package/templates/workspace/.opencode/skills/ws-migrate/SKILL.md +6 -42
  74. package/templates/workspace/.opencode/skills/ws-plan/SKILL.md +4 -2
  75. package/templates/workspace/.opencode/skills/ws-plan-verify/SKILL.md +6 -49
  76. package/templates/workspace/.opencode/skills/ws-preflight/SKILL.md +1 -1
  77. package/templates/workspace/.opencode/skills/ws-pull/SKILL.md +8 -109
  78. package/templates/workspace/.opencode/skills/ws-push/SKILL.md +8 -100
  79. package/templates/workspace/.opencode/skills/ws-quality-review/SKILL.md +1 -1
  80. package/templates/workspace/.opencode/skills/ws-req-change/SKILL.md +1 -1
  81. package/templates/workspace/.opencode/skills/ws-req-contract-sync/SKILL.md +1 -1
  82. package/templates/workspace/.opencode/skills/ws-req-contract-validate/SKILL.md +1 -1
  83. package/templates/workspace/.opencode/skills/ws-req-flow-sync/SKILL.md +1 -1
  84. package/templates/workspace/.opencode/skills/ws-req-review/SKILL.md +1 -1
  85. package/templates/workspace/.opencode/skills/ws-review/SKILL.md +14 -3
  86. package/templates/workspace/.opencode/skills/ws-rule/SKILL.md +1 -1
  87. package/templates/workspace/.opencode/skills/ws-spec-review/SKILL.md +1 -1
  88. package/templates/workspace/.opencode/skills/ws-submodule-setup/SKILL.md +10 -57
  89. package/templates/workspace/.opencode/skills/ws-verify-before-complete/SKILL.md +12 -53
  90. package/templates/workspace/AGENTS.md +5 -2
  91. package/templates/workspace/AI_PROJECT.md +1 -1
  92. package/templates/workspace/changes/README.md +9 -12
  93. package/templates/workspace/manifest.json +265 -207
  94. package/templates/workspace/.agents/skills/ws-migrate/SKILL.md +0 -54
  95. package/templates/workspace/.agents/skills/ws-pull/SKILL.md +0 -119
  96. package/templates/workspace/.agents/skills/ws-push/SKILL.md +0 -110
  97. package/templates/workspace/.agents/skills/ws-submodule-setup/SKILL.md +0 -65
  98. package/templates/workspace/.claude/skills/ws-migrate/SKILL.md +0 -54
  99. package/templates/workspace/.claude/skills/ws-pull/SKILL.md +0 -119
  100. package/templates/workspace/.claude/skills/ws-push/SKILL.md +0 -110
  101. package/templates/workspace/.claude/skills/ws-submodule-setup/SKILL.md +0 -65
@@ -1,59 +1,18 @@
1
1
  ---
2
2
  name: ws-verify-before-complete
3
- description: 完成前验证(finish / handoff 前检查双审查与 validate/evidence 是否齐全)
3
+ description: `aiws ws-verify-before-complete` 的薄包装入口
4
4
  ---
5
5
 
6
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
6
+ # ws-verify-before-complete
7
7
 
8
- 目标:
9
- - 在进入 `$ws-finish` / `$ws-handoff` 前,检查 review、validate stamp 和证据是否齐全
10
- - 输出明确的 pass/fail 结论,避免“看起来完成了但 gate 没过”的伪完成
8
+ `aiws ws-verify-before-complete` 的薄包装入口。
11
9
 
12
- 阶段定位:
13
- - finish gate;负责 completion readiness 检查,不直接做 merge / push / handoff。
14
-
15
- 必需输入:
16
- - `changes/<change-id>/review/spec-review.md`
17
- - `changes/<change-id>/review/quality-review.md`
18
- - `.agentdocs/tmp/aiws-validate/*.json`
19
- - 若存在:`changes/<change-id>/evidence/...`、`git status`
20
-
21
- 必需输出:
22
- - `证据(Evidence):` `changes/<change-id>/evidence/verify-before-complete.md` 或回退 `.agentdocs/tmp/review/verify-before-complete.md`
23
- - `结论(Result):` pass / fail
24
- - `缺失项(Missing):` 未满足的 gate
25
- - `下一步(Next):` 进入 `$ws-finish` / `$ws-handoff`,或回退前置 gate
26
-
27
- 阻断条件:
28
- - 缺少 spec review
29
- - 缺少 quality review
30
- - 缺少 validate stamp
31
- - review 中仍有未关闭 blocker
32
- - 无法写 verification 证据
33
-
34
- 完成判定:
35
- - 已落盘 verify-before-complete 证据,并明确能否进入 `$ws-finish` / `$ws-handoff`。
36
-
37
- 步骤(建议):
38
- 1) 识别当前 `change/<change-id>`。
39
- 2) 检查以下最小 gate:
40
- - `changes/<change-id>/review/spec-review.md`
41
- - `changes/<change-id>/review/quality-review.md`
42
- - `.agentdocs/tmp/aiws-validate/*.json`
43
- 3) 若存在 `changes/<change-id>/evidence/`,检查是否已经收敛 review / validate / collaboration summary。
44
- 4) 将结果落盘到:
45
- - 默认:`changes/<change-id>/evidence/verify-before-complete.md`
46
- - 回退:`.agentdocs/tmp/review/verify-before-complete.md`
47
- 5) 输出:
48
- - `证据(Evidence):`
49
- - `结论(Result): pass|fail`
50
- - `缺失项(Missing):`
51
- - `下一步(Next):`
52
-
53
- 重点:
54
- - 这个 gate 不替代 `$ws-finish`;它只判断“是否具备进入 finish / handoff 的前置条件”。
55
- - 若 fail,必须明确回退到哪个 gate:`$ws-spec-review`、`$ws-quality-review`、`aiws validate . --stamp` 或 `aiws change evidence <change-id>`。
56
-
57
- 安全:
58
- - 不打印 secrets。
59
- - 不执行破坏性命令。
10
+ ```bash
11
+ if [[ -x "./node_modules/.bin/aiws" ]]; then
12
+ ./node_modules/.bin/aiws ws-verify-before-complete
13
+ elif command -v aiws >/dev/null 2>&1; then
14
+ aiws ws-verify-before-complete
15
+ else
16
+ npx @aipper/aiws ws-verify-before-complete
17
+ fi
18
+ ```
@@ -14,7 +14,11 @@
14
14
  3) 将审计落盘到(目录不存在则创建):
15
15
  - 默认:`changes/<change-id>/review/codex-review.md`
16
16
  - 回退:`.agentdocs/tmp/review/codex-review.md`(仅在无法确定 `change-id` 时使用)
17
- 4) 回复中输出:
17
+ 4) 若当前任务已进入“准备提交/交付/finish”的语境,继续补齐 dual review gate:
18
+ - 运行/收敛 `/ws-spec-review`,落盘 `changes/<change-id>/review/spec-review.md`
19
+ - 运行/收敛 `/ws-quality-review`,落盘 `changes/<change-id>/review/quality-review.md`
20
+ - 不要把单个 `codex-review.md` 误当成 finish gate 已完成
21
+ 5) 回复中输出:
18
22
  - `证据(Evidence):` 证据文件路径
19
23
  - `主要风险(Top risks):` 3–8 条(高→低)
20
24
  - `下一步(Next):` 最小修复清单 + 最小验证命令
@@ -0,0 +1,26 @@
1
+ {
2
+ "hooks": {
3
+ "UserPromptSubmit": [
4
+ {
5
+ "matcher": "*",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "mkdir -p .agentdocs/tmp/opencode-autonomy && printf '[user-prompt-submit] %s\\n' \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" >> .agentdocs/tmp/opencode-autonomy/claude-hooks.log"
10
+ }
11
+ ]
12
+ }
13
+ ],
14
+ "Stop": [
15
+ {
16
+ "matcher": "*",
17
+ "hooks": [
18
+ {
19
+ "type": "command",
20
+ "command": "mkdir -p .agentdocs/tmp/opencode-autonomy && printf '[stop] %s\\n' \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" >> .agentdocs/tmp/opencode-autonomy/claude-hooks.log"
21
+ }
22
+ ]
23
+ }
24
+ ]
25
+ }
26
+ }
@@ -1,130 +1,18 @@
1
1
  ---
2
2
  name: ws-commit
3
- description: 提交(当前分支可直提;submodule 感知;先审计/门禁再 commit)
3
+ description: `aiws ws-commit` 的薄包装入口
4
4
  ---
5
5
 
6
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
6
+ # ws-commit
7
7
 
8
- 目标:
9
- - 支持在**当前分支直接提交**(不要求必须先切 `change/<change-id>`)
10
- - 提交前审计与证据落盘(`$ws-review`)
11
- - 提交前门禁校验与证据落盘(`aiws validate . --stamp`)
12
- - 最后执行 `git commit`(commit 前必须让用户确认 message;不使用 `--no-verify` 绕过 hooks)
13
- - 若仓库含 submodule:提交前识别并提示正确顺序(先 submodule,再 superproject)
14
- - 若你经常遇到 submodule detached:建议日常拉取使用 `$ws-pull`(尽量把 submodule “挂回分支”且不改变 gitlink commit)
8
+ `aiws ws-commit` 的薄包装入口。
15
9
 
16
- 安全约束(强制):
17
- - 不自动 `git add -A`(避免误提交);只在用户明确指示时才执行 staging 命令
18
- - 不自动 push
19
- - 不写入任何 secrets
20
- - 检测到 submodule 有未提交改动时,不允许直接提交 superproject(先处理 submodule)
21
- - commit message 优先使用中文(命令/路径/代码标识符保持原样不翻译);格式建议:`<类型>: <简述>`(例如 `修复: 登录页空指针`、`功能: 新增 submodule targets 校验`、`重构: 提取共享脚本`)
22
- - 若启用了 `.githooks/commit-msg`:默认按仓库角色区分
23
- - superproject / root 仓库(存在 `.gitmodules`)默认允许自由 commit message
24
- - submodule / 普通仓库默认提示优先中文
25
- - 只有在 `git config aiws.commitMessagePolicy strict` 时才会拒绝全英文首行(`Merge/Revert/fixup!/squash!` 例外)
26
-
27
- 阶段定位:
28
- - commit gate;负责在提交前收敛 review、validate 和 message 确认,不允许跳过 hooks。
29
-
30
- 必需输入:
31
- - 当前分支与 staged diff
32
- - `$ws-review` 生成的审计证据
33
- - `aiws validate . --stamp` 生成的校验证据
34
- - 用户确认后的 commit message
35
-
36
- 必需输出:
37
- - `证据(Evidence):` review 文件路径 + validate stamp 路径
38
- - `上下文(Context):` 当前分支、submodule 检测结果、阻断原因(若有)
39
- - `提交信息(Commit):` 最终提交信息
40
-
41
- 阻断条件:
42
- - 没有 staged changes
43
- - submodule 工作区不干净或 detached 处理不完整
44
- - 用户未确认 commit message
45
- - validate 失败
46
-
47
- 完成判定:
48
- - 提交已完成,证据路径明确,且没有通过 `--no-verify` 绕过门禁。
49
-
50
- 执行步骤(建议):
51
- 1) 运行 `$ws-preflight`(确保真值文件就绪)。
52
- 2) 运行 `$ws-review`(优先生成审计证据:`changes/<change-id>/review/codex-review.md`;无 `change-id` 时回退 `.agentdocs/tmp/review/codex-review.md`)。
53
- 3) 运行门禁校验并写 stamp:
54
10
  ```bash
55
11
  if [[ -x "./node_modules/.bin/aiws" ]]; then
56
- ./node_modules/.bin/aiws validate . --stamp
12
+ ./node_modules/.bin/aiws ws-commit
57
13
  elif command -v aiws >/dev/null 2>&1; then
58
- aiws validate . --stamp
14
+ aiws ws-commit
59
15
  else
60
- npx @aipper/aiws validate . --stamp
61
- fi
62
- ```
63
- 4) 输出当前提交上下文(必须输出给用户确认):
64
- ```bash
65
- git branch --show-current
66
- git status --porcelain
67
- ```
68
- 5) 检测是否存在 submodule(有则进入 submodule 感知模式):
69
- ```bash
70
- if [[ -f .gitmodules ]]; then
71
- git config --file .gitmodules --get-regexp '^submodule\..*\.path$' || true
72
- else
73
- echo "[info] no .gitmodules"
74
- fi
75
- ```
76
- 6) 若存在 submodule,逐个检查子仓库工作区是否干净:
77
- ```bash
78
- while read -r _ sub_path; do
79
- [[ -z "${sub_path:-}" ]] && continue
80
- echo "== submodule: ${sub_path} =="
81
- git -C "${sub_path}" rev-parse --abbrev-ref HEAD 2>/dev/null || true
82
- git -C "${sub_path}" status --porcelain || true
83
- done < <(git config --file .gitmodules --get-regexp '^submodule\..*\.path$' 2>/dev/null || true)
84
- ```
85
- 判定规则(强制):
86
- - 任一 submodule `git status --porcelain` 非空:停止 superproject commit,先在对应 submodule 完成 commit,再回到 superproject 更新并提交 gitlink。
87
- - 若该 submodule 当前为 detached HEAD:先按 `.gitmodules` 的目标分支挂到 `aiws/pin/<target_branch>`;不要直接切 `change/<change-id>` / `main` / `master` 来“解 detached”。
88
- 处理指引(detached submodule):
89
- ```bash
90
- cur_branch="$(git branch --show-current)"
91
- change_id="$(echo "${cur_branch}" | sed -n 's|^change/||p')"
92
- targets="changes/${change_id}/submodules.targets"
93
-
94
- source tools/ws_resolve_sub_target.sh
95
- ws_resolve_sub_target "${sub_path}" "${sub_name}" "${targets}" "${cur_branch}" || exit 2
96
- target_branch="${_resolved_branch}"
97
- remote="${_resolved_remote}"
98
-
99
- git -C "${sub_path}" fetch "${remote}" --prune
100
- if ! git -C "${sub_path}" show-ref --verify --quiet "refs/remotes/${remote}/${target_branch}"; then
101
- echo "error: missing ${remote}/${target_branch} for submodule path=${sub_path}"
102
- exit 2
16
+ npx @aipper/aiws ws-commit
103
17
  fi
104
- git -C "${sub_path}" checkout -B "aiws/pin/${target_branch}" HEAD
105
- git -C "${sub_path}" branch --set-upstream-to "${remote}/${target_branch}" "aiws/pin/${target_branch}" >/dev/null 2>&1 || true
106
18
  ```
107
- 7) 检查当前 staging 内容(必须输出给用户确认):
108
- ```bash
109
- git status --porcelain
110
- git diff --staged --submodule=short
111
- ```
112
- 8) 若没有 staged changes:停止并提示用户先明确要提交哪些文件(例如 `git add -p` 或 `git add <path>`)。
113
- 9) 生成中文 commit message 草案(格式:`<类型>: <简述>`),输出给用户确认后再执行。
114
- - 类型参考:`功能` / `修复` / `重构` / `文档` / `测试` / `构建` / `杂项`
115
- - 简述用一句话概括本次改动的"为什么"而非"改了什么"
116
- - 命令/路径/代码标识符保持原样不翻译
117
- - 若用户给出全英文 message:优先改写成中文;若用户明确要求保留英文,也可以提交(但 strict 模式下会被 hook 拒绝)
118
- 10) 执行提交(不带 `--no-verify`):
119
- ```bash
120
- git commit -m "<message>"
121
- ```
122
- 11) 输出提交结果(可选):
123
- ```bash
124
- git show --stat --oneline -1
125
- ```
126
-
127
- 输出要求:
128
- - `证据(Evidence):` `changes/<change-id>/review/codex-review.md`(无 `change-id` 时回退 `.agentdocs/tmp/review/codex-review.md`) + `.agentdocs/tmp/aiws-validate/*.json`
129
- - `上下文(Context):` 当前分支 + 是否检测到 submodule + 若阻断则给出阻断原因
130
- - `提交信息(Commit):` 最终使用的 commit message(仅当用户确认后)
@@ -1,230 +1,18 @@
1
1
  ---
2
2
  name: ws-deliver
3
- description: 交付(submodules + superproject 分步提交,并安全合并回目标分支)
3
+ description: `aiws ws-deliver` 的薄包装入口
4
4
  ---
5
5
 
6
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
6
+ # ws-deliver
7
7
 
8
- 目标:
9
- - 适配 superproject + submodule(数量不固定)的交付收尾:
10
- 1) 先逐个提交 submodule(每个 repo 单独确认 commit message)
11
- 2) 再提交 superproject(包含 submodule gitlink 指针更新 + 变更工件/代码)
12
- 3) 最后 fast-forward 合并回目标分支(复用 `aiws change finish`,减少手动 merge 出错)
8
+ `aiws ws-deliver` 的薄包装入口。
13
9
 
14
- 非目标(强制):
15
- - 不自动 `git add -A`(避免误提交)
16
- - 不自动 push
17
- - 不自动删除分支
18
-
19
- 前置(强制):
20
- 1) 先运行 `$ws-preflight`。
21
- 2) 确认当前处于 change 分支(推荐):`change/<change-id>`(也支持 `changes/`、`ws/`、`ws-change/`)。
22
- - 若不在 change 分支:要求用户先切换到 `change/<change-id>`(或在命令里显式提供 `<change-id>`)。
23
- 3) 任何自动提交都必须在提交前输出:
24
- - 该 repo 的 `git status --porcelain`
25
- - 该 repo 的 `git diff --staged`
26
- 并让用户确认 commit message(每个 repo 单独确认)。
27
-
28
- 阶段定位:
29
- - delivery 阶段;负责在多 repo / submodule 场景下完成顺序提交、证据收敛和最终合并前准备。
30
-
31
- 必需输入:
32
- - 当前 `change/<change-id>` 上下文
33
- - 若存在 submodule:`.gitmodules` + `changes/<change-id>/submodules.targets`
34
- - 各 repo 当前状态与 staged diff
35
-
36
- 必需输出:
37
- - `Submodules:` 每个 submodule 的提交摘要
38
- - `Superproject:` 主仓库提交摘要
39
- - `Evidence:` validate stamp 与持久证据路径
40
- - `Next:` 进入 `$ws-finish` 或 `aiws change finish`
41
-
42
- 阻断条件:
43
- - 不在正确的 change 上下文
44
- - submodule branch / targets 真值不完整
45
- - 任一 repo 未确认 commit message 或存在未处理冲突
46
-
47
- 完成判定:
48
- - submodule 与 superproject 提交都已完成,证据已收敛,且可以安全进入 finish 阶段。
49
-
50
- 建议流程(按顺序):
51
-
52
- ## 0) submodule branch 真值检查(减少 detached 与人为差异)
53
- 如果存在 `.gitmodules` 但缺少 `submodule.<name>.branch`,先运行 `$ws-submodule-setup` 并提交 `.gitmodules`,否则后续 `aiws validate .` 会失败,且 `ws-pull/ws-finish` 无法确定性工作。
54
- > 说明:若同一 superproject 分支内存在多渠道 submodule 目标分支的交付需求,可在 `changes/<change-id>/submodules.targets` 额外声明本次 change 的目标分支;交付时会优先使用该文件(不改变 `.gitmodules` 的团队默认真值)。
55
- > 生成该文件时,可以按当前状态做默认预填,但必须显式说明来源并让用户确认:detached HEAD 默认建议取 `.gitmodules` 声明分支;已附着在某个本地分支时默认建议取当前分支;finish/push 最终只认 `submodules.targets`。
56
10
  ```bash
57
- if [[ -f .gitmodules ]]; then
58
- missing=0
59
- while read -r key sub_path; do
60
- name="${key#submodule.}"; name="${name%.path}"
61
- b="$(git config --file .gitmodules --get "submodule.${name}.branch" 2>/dev/null || true)"
62
- if [[ -z "${b:-}" ]]; then
63
- echo "error: missing .gitmodules submodule.${name}.branch (path=${sub_path})"
64
- missing=1
65
- fi
66
- done < <(git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' 2>/dev/null || true)
67
- if [[ "$missing" -ne 0 ]]; then
68
- echo "hint: run $ws-submodule-setup (and commit .gitmodules), then retry"
69
- exit 2
70
- fi
71
-
72
- # 强约束:当 .gitmodules 声明 submodules 时,要求本次 change 存在 submodules.targets 且覆盖所有 submodule path
73
- if git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' >/dev/null 2>&1; then
74
- change_id="$(git branch --show-current | sed -n 's|^change/||p')"
75
- targets="changes/${change_id}/submodules.targets"
76
- if [[ ! -f "${targets}" ]]; then
77
- echo "error: missing ${targets} (required when .gitmodules declares submodules)"
78
- exit 2
79
- fi
80
- t_missing=0
81
- while read -r _ sub_path; do
82
- [[ -z "${sub_path:-}" ]] && continue
83
- if ! awk -v p="${sub_path}" '$1==p && $0 !~ /^[[:space:]]*#/ && $2!="" { found=1 } END { exit(found?0:1) }' "${targets}" 2>/dev/null; then
84
- echo "error: ${targets} missing entry for submodule path=${sub_path}"
85
- t_missing=1
86
- fi
87
- done < <(git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' 2>/dev/null || true)
88
- if [[ "${t_missing}" -ne 0 ]]; then
89
- echo "hint: fill ${targets} as: <path> <target_branch> [remote]"
90
- exit 2
91
- fi
92
- fi
93
- fi
94
- ```
95
-
96
- ## A) 发现 submodules 清单(数量不固定)
97
- 在 superproject 根目录执行:
98
- ```bash
99
- git submodule status --recursive
100
- ```
101
- 如果没有 submodule:跳到 C)。
102
-
103
- ## B) 逐个提交 submodules(先 submodule,后 superproject)
104
- 对每个 submodule path(可递归)重复以下步骤(建议按 `git submodule status --recursive` 顺序):
105
- 1) 定位并检查状态:
106
- ```bash
107
- sub_path="<path>"
108
- git -C "$sub_path" branch --show-current
109
- git -C "$sub_path" status --porcelain
110
- ```
111
- 2) 先确定该 submodule 的目标分支来源,并显式说明给用户:
112
- - `branch --show-current` 非空:默认建议用当前分支
113
- - `branch --show-current` 为空(detached HEAD):默认建议用 `.gitmodules` 的 `submodule.<name>.branch`
114
- - 若建议值与 `changes/<change-id>/submodules.targets` 已落盘值不一致:以 `submodules.targets` 为准,并先提示差异
115
- 3) 若 submodule 处于 detached HEAD(`branch --show-current` 为空):
116
- - 说明:这通常是因为 superproject 的 gitlink checkout(例如 `git submodule update`)导致 detached。
117
- - 不要直接切 `change/<change-id>` / `main` / `master` 来解 detached。
118
- - 若你要在该 submodule 里提交:先按目标分支挂到 pin 分支 `aiws/pin/<target-branch>`,再在其上提交:
119
- - 目标分支真值优先级:`changes/<change-id>/submodules.targets`(若存在)> `.gitmodules submodule.<name>.branch`
120
- ```bash
121
- change_id="<change-id>"
122
- targets="changes/${change_id}/submodules.targets"
123
- sub_name="$(git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' 2>/dev/null | awk -v p="${sub_path}" '$2==p { name=$1; sub(/^submodule\\./,"",name); sub(/\\.path$/,"",name); print name; exit }')"
124
- base_branch="$(python3 - <<'PY'
125
- import json, pathlib
126
- change_id = "<change-id>"
127
- meta = pathlib.Path("changes") / change_id / ".ws-change.json"
128
- data = json.loads(meta.read_text(encoding="utf-8"))
129
- print((data.get("base_branch") or "").strip())
130
- PY
131
- )"
132
- test -n "${sub_name}"
133
- test -n "${base_branch}"
134
-
135
- source tools/ws_resolve_sub_target.sh
136
- ws_resolve_sub_target "${sub_path}" "${sub_name}" "${targets}" "${base_branch}" || exit 2
137
- target_branch="${_resolved_branch}"
138
- remote="${_resolved_remote}"
139
-
140
- git -C "$sub_path" fetch "${remote}" --prune
141
- if ! git -C "$sub_path" show-ref --verify --quiet "refs/remotes/${remote}/${target_branch}"; then
142
- echo "error: missing ${remote}/${target_branch} for submodule path=${sub_path}"
143
- exit 2
144
- fi
145
- git -C "$sub_path" checkout -B "aiws/pin/${target_branch}" HEAD
146
- git -C "$sub_path" branch --set-upstream-to "${remote}/${target_branch}" "aiws/pin/${target_branch}" >/dev/null 2>&1 || true
147
- ```
148
- - 若 `origin/<target-branch>` 不存在,或用户明确不想使用 pin 分支:停止,解释风险(提交可能不可追溯/难以推送)。
149
- 4) 选择性 staging(默认用 `-p` 更安全):
150
- ```bash
151
- git -C "$sub_path" add -p
152
- git -C "$sub_path" diff --staged --stat
153
- git -C "$sub_path" diff --staged
154
- ```
155
- 5) AI 生成该 submodule 的 commit message(标题+可选 body),并让用户确认(每个 repo 单独确认)。
156
- 6) 执行提交(不带 `--no-verify`):
157
- ```bash
158
- git -C "$sub_path" commit -m "<message>"
159
- ```
160
- 7) 若该 submodule 没有 staged changes:跳过(不要硬提交空 commit)。
161
-
162
- ## C) 提交 superproject(更新 gitlinks + 自身改动 + changes 工件)
163
- 1) 先检查 submodule 指针差异(gitlinks):
164
- ```bash
165
- git diff --submodule
166
- ```
167
- 2) 选择性 staging:
168
- - 先 stage 发生指针变化的 submodule 路径(明确列出):
169
- ```bash
170
- git add <submodule-path-1> <submodule-path-2>
171
- ```
172
- - 再 stage superproject 自身改动(默认 `-p`):
173
- ```bash
174
- git add -p
175
- git diff --staged --stat
176
- git diff --staged
177
- ```
178
- 3) AI 生成 superproject 的 commit message(应包含 `bump submodule <name> -> <sha>` 等关键信息),并让用户确认。
179
- 4) 提交:
180
- ```bash
181
- git commit -m "<message>"
182
- ```
183
-
184
- ## D) 门禁与证据(推荐)
185
- ```bash
186
- if [[ -x "./node_modules/.bin/aiws" ]]; then
187
- ./node_modules/.bin/aiws validate . --stamp
188
- elif command -v aiws >/dev/null 2>&1; then
189
- aiws validate . --stamp
190
- else
191
- npx @aipper/aiws validate . --stamp
192
- fi
193
- ```
194
-
195
- ## D2) 生成持久证据并回填 Evidence_Path(强烈建议)
196
- > 说明:`.agentdocs/tmp/...` 默认 gitignored;交付前建议把关键结果落到 `changes/<change-id>/evidence/...` 并回填 `proposal.md`/`plan` 的 `Evidence_Path`,避免后续评审/二次会话读不到证据。
197
- ```bash
198
- change_id="<change-id>"
199
11
  if [[ -x "./node_modules/.bin/aiws" ]]; then
200
- ./node_modules/.bin/aiws change evidence "${change_id}"
12
+ ./node_modules/.bin/aiws ws-deliver
201
13
  elif command -v aiws >/dev/null 2>&1; then
202
- aiws change evidence "${change_id}"
14
+ aiws ws-deliver
203
15
  else
204
- npx @aipper/aiws change evidence "${change_id}"
16
+ npx @aipper/aiws ws-deliver
205
17
  fi
206
18
  ```
207
-
208
- ## D3) 生成状态快照(可选,建议)
209
- ```bash
210
- aiws change state "${change_id}" --write
211
- ```
212
-
213
- ## E) 安全合并回目标分支(fast-forward)
214
- 优先使用 `$ws-finish`(底层调用 `aiws change finish`,并在 push 成功后清理对应 change worktree)。
215
-
216
- 若需要显式指定目标分支:
217
- ```bash
218
- aiws change finish <change-id> --into <base-branch>
219
- ```
220
-
221
- ## F) 归档说明
222
- - 标准链路下不需要再单独执行 `aiws change archive <change-id>`。
223
- - 进入 `$ws-finish` 并使用 `aiws change finish --push` 时,会自动完成 archive + handoff。
224
-
225
- 输出要求:
226
- - `Submodules:` 每个 submodule 的分支/提交摘要(repo → commit sha → message)
227
- - `Superproject:` 提交摘要
228
- - `Merge:` `aiws change finish` 的输出(into/from)
229
- - `Worktree cleanup:` 若存在独立 change worktree,输出清理结果(removed/skipped + reason)
230
- - `Evidence:` `.agentdocs/tmp/aiws-validate/*.json`(若使用 --stamp)