@aipper/aiws-spec 0.0.29 → 0.0.30
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.
- package/docs/workflow-delegation-contracts.json +40 -1
- package/docs/workflow-delegation-contracts.md +10 -0
- package/docs/workflow-delegation-contracts.schema.json +57 -0
- package/docs/workflow-governance-rules.md +1 -1
- package/docs/workflow-review-gates.json +6 -0
- package/docs/workflow-review-gates.md +14 -5
- package/docs/workflow-review-gates.schema.json +4 -0
- package/docs/workflow-router-rules.json +46 -14
- package/docs/workflow-router-rules.md +19 -16
- package/docs/workflow-router-rules.schema.json +4 -0
- package/docs/workflow-stage-contracts.json +22 -2
- package/docs/workflow-stage-contracts.md +15 -13
- package/docs/workflow-stage-contracts.schema.json +12 -1
- package/package.json +1 -1
- package/templates/workspace/.agents/skills/using-aiws/SKILL.md +10 -6
- package/templates/workspace/.agents/skills/ws-commit/SKILL.md +5 -5
- package/templates/workspace/.agents/skills/ws-deliver/SKILL.md +5 -5
- package/templates/workspace/.agents/skills/ws-dev/SKILL.md +30 -0
- package/templates/workspace/.agents/skills/ws-finish/SKILL.md +9 -5
- package/templates/workspace/.agents/skills/ws-handoff/SKILL.md +5 -5
- package/templates/workspace/.agents/skills/ws-migrate/SKILL.md +18 -0
- package/templates/workspace/.agents/skills/ws-plan-verify/SKILL.md +5 -5
- package/templates/workspace/.agents/skills/ws-pull/SKILL.md +18 -0
- package/templates/workspace/.agents/skills/ws-push/SKILL.md +18 -0
- package/templates/workspace/.agents/skills/ws-submodule-setup/SKILL.md +18 -0
- package/templates/workspace/.agents/skills/ws-verify-before-complete/SKILL.md +5 -5
- package/templates/workspace/{changes → .aiws/changes}/README.md +13 -13
- package/templates/workspace/{changes → .aiws/changes}/templates/proposal.md +12 -12
- package/templates/workspace/{changes → .aiws/changes}/templates/tasks.md +8 -8
- package/templates/workspace/{issues → .aiws/issues}/problem-issues.csv +1 -1
- package/templates/workspace/.aiws/journal/.gitkeep +1 -0
- package/templates/workspace/{requirements → .aiws/requirements}/requirements-issues.csv +1 -1
- package/templates/workspace/.aiws/tmp/.gitkeep +0 -0
- package/templates/workspace/{tools → .aiws/tools}/requirements_contract.py +2 -2
- package/templates/workspace/{tools → .aiws/tools}/requirements_contract_sync.py +2 -2
- package/templates/workspace/{tools → .aiws/tools}/requirements_flow_gen.py +1 -1
- package/templates/workspace/{tools → .aiws/tools}/server_test_runner.py +10 -10
- package/templates/workspace/{tools → .aiws/tools}/ws_change_check.py +23 -23
- package/templates/workspace/{tools → .aiws/tools}/ws_resolve_sub_target.sh +2 -2
- package/templates/workspace/{tools → .aiws/tools}/ws_tasks_plan.py +3 -3
- package/templates/workspace/.claude/skills/ws-commit/SKILL.md +5 -5
- package/templates/workspace/.claude/skills/ws-deliver/SKILL.md +5 -5
- package/templates/workspace/.claude/skills/ws-finish/SKILL.md +9 -5
- package/templates/workspace/.claude/skills/ws-handoff/SKILL.md +5 -5
- package/templates/workspace/.claude/skills/ws-migrate/SKILL.md +18 -0
- package/templates/workspace/.claude/skills/ws-plan-verify/SKILL.md +5 -5
- package/templates/workspace/.claude/skills/ws-pull/SKILL.md +18 -0
- package/templates/workspace/.claude/skills/ws-push/SKILL.md +18 -0
- package/templates/workspace/.claude/skills/ws-submodule-setup/SKILL.md +18 -0
- package/templates/workspace/.claude/skills/ws-verify-before-complete/SKILL.md +5 -5
- package/templates/workspace/.githooks/pre-commit +13 -0
- package/templates/workspace/.githooks/pre-push +7 -0
- package/templates/workspace/.opencode/commands/ws-finish.md +66 -1
- package/templates/workspace/.opencode/helpers/approval-whitelist-check.sh +1 -1
- package/templates/workspace/.opencode/helpers/approval-whitelist-run.sh +1 -1
- package/templates/workspace/.opencode/helpers/approval-whitelist-watchdog.sh +1 -1
- package/templates/workspace/.opencode/helpers/tmux-swarm-rescue.sh +1 -1
- package/templates/workspace/.opencode/helpers/tmux-swarm-scan.sh +1 -1
- package/templates/workspace/.opencode/lib/aiws-context.js +953 -0
- package/templates/workspace/.opencode/plugins/aiws-inject-context.js +201 -0
- package/templates/workspace/.opencode/plugins/aiws-session-start.js +86 -0
- package/templates/workspace/.opencode/plugins/aiws-workflow-state.js +116 -0
- package/templates/workspace/.opencode/scripts/ws-plan-gen-submodule-targets.sh +27 -0
- package/templates/workspace/.opencode/scripts/ws-plan-setup-worktree.sh +31 -0
- package/templates/workspace/.opencode/skills/using-aiws/SKILL.md +39 -2
- package/templates/workspace/.opencode/skills/ws-commit/SKILL.md +5 -5
- package/templates/workspace/.opencode/skills/ws-delegate/SKILL.md +22 -0
- package/templates/workspace/.opencode/skills/ws-deliver/SKILL.md +5 -5
- package/templates/workspace/.opencode/skills/ws-dev/SKILL.md +52 -4
- package/templates/workspace/.opencode/skills/ws-dev-lite/SKILL.md +4 -1
- package/templates/workspace/.opencode/skills/ws-finish/SKILL.md +9 -5
- package/templates/workspace/.opencode/skills/ws-handoff/SKILL.md +5 -5
- package/templates/workspace/.opencode/skills/ws-intake/SKILL.md +32 -2
- package/templates/workspace/.opencode/skills/ws-migrate/SKILL.md +5 -5
- package/templates/workspace/.opencode/skills/ws-plan/SKILL.md +11 -53
- package/templates/workspace/.opencode/skills/ws-plan-verify/SKILL.md +5 -5
- package/templates/workspace/.opencode/skills/ws-pull/SKILL.md +5 -5
- package/templates/workspace/.opencode/skills/ws-push/SKILL.md +5 -5
- package/templates/workspace/.opencode/skills/ws-quality-review/SKILL.md +6 -1
- package/templates/workspace/.opencode/skills/ws-review/SKILL.md +25 -5
- package/templates/workspace/.opencode/skills/ws-submodule-setup/SKILL.md +5 -5
- package/templates/workspace/.opencode/skills/ws-verify-before-complete/SKILL.md +36 -5
- package/templates/workspace/AGENTS.md +32 -87
- package/templates/workspace/AI_PROJECT.md +4 -4
- package/templates/workspace/AI_WORKSPACE.md +1 -1
- package/templates/workspace/REQUIREMENTS.md +1 -1
- package/templates/workspace/gitignore +1 -1
- package/templates/workspace/manifest.json +96 -334
- /package/templates/workspace/{changes → .aiws/changes}/templates/design.md +0 -0
- /package/templates/workspace/{memory-bank → .aiws/memory-bank}/README.md +0 -0
- /package/templates/workspace/{memory-bank → .aiws/memory-bank}/architecture.md +0 -0
- /package/templates/workspace/{memory-bank → .aiws/memory-bank}/implementation-plan.md +0 -0
- /package/templates/workspace/{memory-bank → .aiws/memory-bank}/progress.md +0 -0
- /package/templates/workspace/{memory-bank → .aiws/memory-bank}/tech-stack.md +0 -0
- /package/templates/workspace/{requirements → .aiws/requirements}/CHANGELOG.md +0 -0
- /package/templates/workspace/{secrets → .aiws/secrets}/test-accounts.example.json +0 -0
|
@@ -23,11 +23,32 @@ description: 使用时机:需要修改代码、配置、测试时。触发词
|
|
|
23
23
|
- `证据(Evidence):` `plan/...`、`changes/<change-id>/...`、`.agentdocs/tmp/...` 等证据路径
|
|
24
24
|
- `Next:` 若准备提交,建议 `$ws-review` 或 `$ws-commit`
|
|
25
25
|
|
|
26
|
-
##
|
|
26
|
+
## 前置条件(硬阻断 — 必须最先检查)
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
在开始任何代码改动之前,必须完成以下检查:
|
|
29
|
+
|
|
30
|
+
1. **Design Gate**:若 `changes/<change-id>/proposal.md` 不存在:
|
|
31
|
+
- 立即停止,不要写代码
|
|
32
|
+
- 输出:`BLOCKED: 缺少 proposal。请先执行 $ws-plan 创建变更计划与任务分解。`
|
|
33
|
+
2. **Task Gate**:若 `changes/<change-id>/tasks.md` 不存在:
|
|
34
|
+
- 立即停止,不要写代码
|
|
35
|
+
- 输出:`BLOCKED: 缺少 tasks。请先执行 $ws-plan 创建任务分解。`
|
|
36
|
+
|
|
37
|
+
> 例外:`ws-dev-lite` 是轻量入口,可豁免 Design Gate,但仅限单文件/typo/config/bugfix 场景。
|
|
38
|
+
|
|
39
|
+
## TDD 约束(强制)
|
|
40
|
+
|
|
41
|
+
对于所有需要编写新代码或修改业务逻辑的任务,必须遵守 RED-GREEN-REFACTOR 流程:
|
|
42
|
+
|
|
43
|
+
1. **RED**:先编写测试用例,运行并确认测试失败(或确认现有测试覆盖缺口)
|
|
44
|
+
2. **GREEN**:编写最小实现代码使测试通过
|
|
45
|
+
3. **REFACTOR**:重构代码,保持测试通过
|
|
46
|
+
|
|
47
|
+
禁止:
|
|
48
|
+
- 先写实现代码再补测试
|
|
49
|
+
- 跳过测试步骤直接提交
|
|
50
|
+
|
|
51
|
+
自我检查顺序(每次修改后):`lint → typecheck → test`。若项目无对应脚本则跳过该项。
|
|
31
52
|
|
|
32
53
|
## 完成判定
|
|
33
54
|
|
|
@@ -40,9 +61,18 @@ description: 使用时机:需要修改代码、配置、测试时。触发词
|
|
|
40
61
|
定位项目根目录,读取 `AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`,输出约束摘要。
|
|
41
62
|
|
|
42
63
|
- 中大型任务:建议先用 `$ws-plan` 生成 `plan/` 工件。
|
|
64
|
+
- 中大型任务默认执行 [3.1 自我修正循环](#31-自我修正循环evaluate-optimize)——这是必经步骤,不是可选项:实现后先自审修正(最多 2 轮),再进入 review
|
|
43
65
|
- 已有计划:先 `$ws-plan-verify`,通过后进入实现。
|
|
44
66
|
- `$ws-plan` 已创建 worktree:直接在该 worktree 中继续。
|
|
45
67
|
|
|
68
|
+
### 1.5 Spec Refresh(进入实现前必做)
|
|
69
|
+
|
|
70
|
+
在开始任何代码改动前,强制重读并输出摘要:
|
|
71
|
+
- `AI_PROJECT.md` 安全边界(哪些目录不能动、哪些约束必须遵守)
|
|
72
|
+
- `REQUIREMENTS.md` 中与本次 `Req_ID` 相关的条目(摘要 2-3 段即可)
|
|
73
|
+
|
|
74
|
+
目的:避免落地时遗忘约束或需求边界。仅需 2-3 段摘要,不需要全文复读。
|
|
75
|
+
|
|
46
76
|
### 2. 建立变更归因
|
|
47
77
|
|
|
48
78
|
- 若 `git status --porcelain` 仅有计划/工件文件,属于预期行为,继续即可。
|
|
@@ -60,6 +90,24 @@ description: 使用时机:需要修改代码、配置、测试时。触发词
|
|
|
60
90
|
- 根据 review 结果决定 fix 或收敛 evidence
|
|
61
91
|
- **Inline escape hatch**:如果用户明确说"你直接改"或"do it inline",主 session 可直接写代码,但必须落盘 evidence 记录理由
|
|
62
92
|
|
|
93
|
+
**验证先行推荐**:对于非 trivial 改动,建议先确认验证入口再开始实现:
|
|
94
|
+
1. 先确认 `AI_WORKSPACE.md` 中对应的验证命令
|
|
95
|
+
2. 若验证命令不明确:先补验证入口,再开始实现
|
|
96
|
+
3. 可选模式(不强求 TDD):先写最小验证 → 实现 → 补完整验证
|
|
97
|
+
|
|
98
|
+
### 3.1 自我修正循环(evaluate-optimize)——必经步骤
|
|
99
|
+
|
|
100
|
+
在 dispatch subagent 前,主 session 必须执行最多 **2 轮** 自审+修正循环:
|
|
101
|
+
|
|
102
|
+
1. **实现** → subagent 产出代码
|
|
103
|
+
2. **自审** → 主 session 检查:lint/type-check 是否通过?是否符合现有代码模式?是否有明显 bug?
|
|
104
|
+
3. **修正** → 如果发现问题,要求 subagent 修正后重新提交
|
|
105
|
+
4. **2 轮上限** → 如果 2 轮后仍有问题,升级到 `$ws-review` 做正式审查
|
|
106
|
+
|
|
107
|
+
**适用场景**:所有非 trivial 改动(单文件修复、配置调整、小步实现、中大型任务均适用)。不适合跨模块架构变更——此类变更直接走 $ws-review。
|
|
108
|
+
|
|
109
|
+
**注意**:这不是替代 `$ws-review` 的门禁;自审通过后仍需走正式 review gate。
|
|
110
|
+
|
|
63
111
|
### 4. 其他规则
|
|
64
112
|
|
|
65
113
|
- 需求调整:先 `$ws-req-review` → 确认后 `$ws-req-change`
|
|
@@ -14,8 +14,10 @@ description: 使用时机:单文件/小范围快速修复时。触发词:轻
|
|
|
14
14
|
适用前提:
|
|
15
15
|
- 目标明确,且能归因到 `Req_ID` 或 `Problem_ID`
|
|
16
16
|
- 验证入口明确,且能做最小可复现验证
|
|
17
|
-
-
|
|
17
|
+
- 一般只影响单文件或紧密相关的小范围文件(≤2 文件,≤100 行)
|
|
18
18
|
- 不需要先改 `REQUIREMENTS.md`,也不需要先单独做 review
|
|
19
|
+
- 仅限以下场景:typo 修复、配置调整、已知回归修复、单点 bugfix
|
|
20
|
+
- 禁止用于:新 feature 开发、跨模块重构、架构变更
|
|
19
21
|
|
|
20
22
|
立即升级回主流程的情形:
|
|
21
23
|
- 发现任务其实是 medium/complex、跨模块、跨目录或需要方案设计
|
|
@@ -25,6 +27,7 @@ description: 使用时机:单文件/小范围快速修复时。触发词:轻
|
|
|
25
27
|
|
|
26
28
|
默认约束:
|
|
27
29
|
- 先做 `$ws-preflight`
|
|
30
|
+
- **Escape Hatch**:若用户明确说"跳过流程"/"直接改",允许 early-start 实现,但必须输出 `[escape-hatch: direct-implementation]` 标记,并仍然遵守最小约束(归因、验证、evidence)
|
|
28
31
|
- 默认不创建 `plan/...`
|
|
29
32
|
- 默认不跑 `$ws-plan-verify`
|
|
30
33
|
- 默认不要求先做双 review
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ws-finish
|
|
3
|
-
description:
|
|
3
|
+
description: `aiws finish` 的收尾入口(finish_resume_required)
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ws-finish
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
`aiws finish` 的收尾入口。
|
|
9
|
+
|
|
10
|
+
关键契约:
|
|
11
|
+
- 若 `aiws change status <change-id>` 输出 `governance_rule: finish_resume_required`,继续执行 `aiws change finish <change-id> --push`
|
|
12
|
+
- 普通 finish 的 `validate/evidence/state` 仍应在 `change/<change-id>` worktree 完成,不要在目标 worktree 里跑 `aiws validate . --stamp`
|
|
9
13
|
|
|
10
14
|
```bash
|
|
11
15
|
if [[ -x "./node_modules/.bin/aiws" ]]; then
|
|
12
|
-
./node_modules/.bin/aiws
|
|
16
|
+
./node_modules/.bin/aiws finish
|
|
13
17
|
elif command -v aiws >/dev/null 2>&1; then
|
|
14
|
-
aiws
|
|
18
|
+
aiws finish
|
|
15
19
|
else
|
|
16
|
-
npx @aipper/aiws
|
|
20
|
+
npx @aipper/aiws finish
|
|
17
21
|
fi
|
|
18
22
|
```
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ws-handoff
|
|
3
|
-
description: Thin wrapper for `aiws
|
|
3
|
+
description: Thin wrapper for `aiws handoff`
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ws-handoff
|
|
7
7
|
|
|
8
|
-
Thin skill wrapper. Delegates to `aiws
|
|
8
|
+
Thin skill wrapper. Delegates to `aiws handoff`. See `aiws handoff --help` for details.
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
if [[ -x "./node_modules/.bin/aiws" ]]; then
|
|
12
|
-
./node_modules/.bin/aiws
|
|
12
|
+
./node_modules/.bin/aiws handoff
|
|
13
13
|
elif command -v aiws >/dev/null 2>&1; then
|
|
14
|
-
aiws
|
|
14
|
+
aiws handoff
|
|
15
15
|
else
|
|
16
|
-
npx @aipper/aiws
|
|
16
|
+
npx @aipper/aiws handoff
|
|
17
17
|
fi
|
|
18
18
|
```
|
|
@@ -10,6 +10,35 @@ description: 使用时机:新需求需要逐条澄清、冻结问题时。触
|
|
|
10
10
|
- 采用“一题一线程”模式推进:每次只处理 1 个问题,允许该问题多轮往返,直到形成明确结论。
|
|
11
11
|
- 产出一份可被 `/ws-plan` 消费的轻量草案:`plan/<timestamp>-<slug>.intake.md`。
|
|
12
12
|
|
|
13
|
+
## 发散-收敛两子阶段
|
|
14
|
+
|
|
15
|
+
当需求模糊、方向不明确时,intake 分两子阶段推进:
|
|
16
|
+
|
|
17
|
+
### 发散阶段(Explore)
|
|
18
|
+
- 目标:快速探索 2-3 个可能方向,不深入任何单一方向
|
|
19
|
+
- 输出:每个方向的 1-2 段摘要 + 关键风险 + 依赖
|
|
20
|
+
- 时限:不超过 3 轮对话
|
|
21
|
+
|
|
22
|
+
### 收敛阶段(Converge)
|
|
23
|
+
- 目标:从发散结果中选择 1 个方向,逐条冻结具体问题
|
|
24
|
+
- 回到标准"一题一线程"模式
|
|
25
|
+
- 把发散产出的摘要作为收敛的输入上下文
|
|
26
|
+
|
|
27
|
+
触发条件:用户说"不确定"/"多个方向"/"帮我分析" 等模糊表达。
|
|
28
|
+
非模糊需求不需要经过发散阶段,直接进入收敛。
|
|
29
|
+
|
|
30
|
+
## 核心原则:一次一个问题
|
|
31
|
+
|
|
32
|
+
- 每轮只推进 1 个 `Open Questions` 中的问题
|
|
33
|
+
- 当前问题未标记 `frozen` 或 `deferred` 前,不进入下一题
|
|
34
|
+
- 输出格式:`Current question → Why it matters → Options → Exit condition`
|
|
35
|
+
- 用户选择后立即写盘更新草案,再进入下一题
|
|
36
|
+
|
|
37
|
+
**队列保护**:若用户一次提出多个问题,必须显式建队(Queue),逐一处理——不可同时推进多个维度。队列格式:
|
|
38
|
+
- Queue: [Q1: ..., Q2: ..., Q3: ...]
|
|
39
|
+
- Current: Q1
|
|
40
|
+
- Status: [open/in_discussion/frozen/deferred] per item
|
|
41
|
+
|
|
13
42
|
执行要求:
|
|
14
43
|
1) 先读 `AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`,必要时先 `/ws-preflight`。
|
|
15
44
|
2) 若存在最新 `plan/*.intake.md`,先续写它;否则新建一份 intake 草案。
|
|
@@ -18,8 +47,9 @@ description: 使用时机:新需求需要逐条澄清、冻结问题时。触
|
|
|
18
47
|
- `Current question:`
|
|
19
48
|
- `Why it matters:`
|
|
20
49
|
- `Current options / current understanding:`
|
|
21
|
-
|
|
22
|
-
|
|
50
|
+
- `Exit condition:`
|
|
51
|
+
- 每个问题独立线程:在未标记 frozen/deferred 前,不进入下一题。问答往返不限轮数,但一次只处理一个维度的决策。
|
|
52
|
+
5) 若用户一次提出多个问题,必须显式排队:列出所有问题编号,按顺序逐个处理;不得同时推进多个问题的讨论。输出格式:`Queued questions: #1, #2, ... | Current: #1`
|
|
23
53
|
6) 每轮都要把 intake 草案写盘,至少包含:
|
|
24
54
|
- `Context`
|
|
25
55
|
- `Open Questions`
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ws-migrate
|
|
3
|
-
description: Thin wrapper for `aiws
|
|
3
|
+
description: Thin wrapper for `aiws migrate`
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ws-migrate
|
|
7
7
|
|
|
8
|
-
Thin skill wrapper. Delegates to `aiws
|
|
8
|
+
Thin skill wrapper. Delegates to `aiws migrate`. See `aiws migrate --help` for details.
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
if [[ -x "./node_modules/.bin/aiws" ]]; then
|
|
12
|
-
./node_modules/.bin/aiws
|
|
12
|
+
./node_modules/.bin/aiws migrate
|
|
13
13
|
elif command -v aiws >/dev/null 2>&1; then
|
|
14
|
-
aiws
|
|
14
|
+
aiws migrate
|
|
15
15
|
else
|
|
16
|
-
npx @aipper/aiws
|
|
16
|
+
npx @aipper/aiws migrate
|
|
17
17
|
fi
|
|
18
18
|
```
|
|
@@ -52,41 +52,15 @@ OpenCode + oMo 优先策略:
|
|
|
52
52
|
- 若检测到 oMo:优先让 `planner-sisyphus` 生成 planning draft;若需要补结构探索,再委托 `@explore` / `@librarian`。
|
|
53
53
|
2) 若用户任务描述不清:先问 1-3 个关键澄清问题(不要猜)。
|
|
54
54
|
3) 判断复杂度:`simple / medium / complex`(给出一句理由),并估算步骤数。
|
|
55
|
-
4) 识别或建立主索引 / change 上下文:
|
|
55
|
+
4) 识别或建立主索引 / change 上下文:
|
|
56
56
|
- 若存在 `changes/<change-id>/proposal.md`:读取其中 `Change_ID` / `Req_ID` / `Problem_ID` / `Contract_Row` / `Evidence_Path`
|
|
57
57
|
- 若缺失关键绑定:先补齐 proposal(至少 `Change_ID`、`Req_ID|Problem_ID`、`Contract_Row`)再继续生成计划
|
|
58
|
-
- 若当前不在 `change/<change-id>` 分支 / worktree,且本次任务需要新建 change
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
change_id="<change-id>"
|
|
65
|
-
if [[ -n "$(git status --porcelain)" ]]; then
|
|
66
|
-
echo "error: working tree dirty before ws-plan creates change context"
|
|
67
|
-
echo "hint: commit/stash first, or continue inside an existing change/<change-id> context"
|
|
68
|
-
exit 2
|
|
69
|
-
fi
|
|
70
|
-
|
|
71
|
-
has_commits=0
|
|
72
|
-
git rev-parse --verify HEAD >/dev/null 2>&1 && has_commits=1
|
|
73
|
-
|
|
74
|
-
has_submodules=0
|
|
75
|
-
if [[ -f .gitmodules ]] && git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' >/dev/null 2>&1; then
|
|
76
|
-
has_submodules=1
|
|
77
|
-
fi
|
|
78
|
-
|
|
79
|
-
if [[ "${has_commits}" -eq 1 ]]; then
|
|
80
|
-
if [[ "${has_submodules}" -eq 1 ]]; then
|
|
81
|
-
aiws change start "${change_id}" --hooks --worktree --submodules
|
|
82
|
-
else
|
|
83
|
-
aiws change start "${change_id}" --hooks --worktree
|
|
84
|
-
fi
|
|
85
|
-
else
|
|
86
|
-
aiws change start "${change_id}" --hooks --no-switch
|
|
87
|
-
fi
|
|
88
|
-
```
|
|
89
|
-
- 若上一步创建了 worktree:后续所有读取/写入都必须切到 `aiws change start` 输出的 `worktree:` 路径中进行;不要把 `plan/...` 写回原工作区
|
|
58
|
+
- 若当前不在 `change/<change-id>` 分支 / worktree,且本次任务需要新建 change:
|
|
59
|
+
```bash
|
|
60
|
+
bash .opencode/scripts/ws-plan-setup-worktree.sh <change-id>
|
|
61
|
+
```
|
|
62
|
+
脚本自动处理:dirty 检查、commits/submodules 检测、worktree 创建。
|
|
63
|
+
- 若脚本创建了 worktree:后续所有读取/写入都必须切到 `aiws change start` 输出的 `worktree:` 路径中进行;不要把 `plan/...` 写回原工作区
|
|
90
64
|
5) 生成计划文件:
|
|
91
65
|
- 文件名:`plan/YYYY-MM-DD_HH-MM-SS-<slug>.md`(`<slug>` 用 kebab-case;同一任务调整计划时尽量复用同一文件)
|
|
92
66
|
- 若 `plan/` 不存在先创建
|
|
@@ -122,26 +96,10 @@ oMo 回退:
|
|
|
122
96
|
- 第 1 列:submodule path(例如 `vendor/foo`)
|
|
123
97
|
- 第 2 列:target branch(例如 `release/channel-a`)
|
|
124
98
|
- 第 3 列(可选):remote 名(默认 `origin`)
|
|
125
|
-
-
|
|
126
|
-
```bash
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
mkdir -p "changes/${change_id}"
|
|
130
|
-
if [[ -f "${targets}" ]]; then
|
|
131
|
-
bak="${targets}.bak.$(date -u +%Y%m%d-%H%M%SZ)"
|
|
132
|
-
cp "${targets}" "${bak}"
|
|
133
|
-
echo "info: backup: ${bak}"
|
|
134
|
-
fi
|
|
135
|
-
: > "${targets}"
|
|
136
|
-
echo "# path<TAB>target_branch<TAB>remote(optional, default=origin)" >> "${targets}"
|
|
137
|
-
while read -r key sub_path; do
|
|
138
|
-
name="${key#submodule.}"; name="${name%.path}"
|
|
139
|
-
b="$(git config --file .gitmodules --get "submodule.${name}.branch" 2>/dev/null || true)"
|
|
140
|
-
[[ "${b:-}" == "." ]] && b="$(git branch --show-current)" # '.' means "follow superproject branch"
|
|
141
|
-
printf "%s\t%s\t%s\n" "${sub_path}" "${b:-<fill-me>}" "origin" >> "${targets}"
|
|
142
|
-
done < <(git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$' 2>/dev/null || true)
|
|
143
|
-
echo "ok: wrote ${targets}"
|
|
144
|
-
```
|
|
99
|
+
- 生成模板:
|
|
100
|
+
```bash
|
|
101
|
+
bash .opencode/scripts/ws-plan-gen-submodule-targets.sh <change-id>
|
|
102
|
+
```
|
|
145
103
|
- 计划里必须写清:本次交付选择的 `targets` 内容,以及后续在 `$ws-dev` 进入编码前会把 submodules 挂到 `aiws/pin/<target_branch>`(必要时先 `fetch`)。
|
|
146
104
|
|
|
147
105
|
输出要求:
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ws-plan-verify
|
|
3
|
-
description: Thin wrapper for `aiws
|
|
3
|
+
description: Thin wrapper for `aiws plan-verify`
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ws-plan-verify
|
|
7
7
|
|
|
8
|
-
Thin skill wrapper. Delegates to `aiws
|
|
8
|
+
Thin skill wrapper. Delegates to `aiws plan-verify`. See `aiws plan-verify --help` for details.
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
if [[ -x "./node_modules/.bin/aiws" ]]; then
|
|
12
|
-
./node_modules/.bin/aiws
|
|
12
|
+
./node_modules/.bin/aiws plan-verify
|
|
13
13
|
elif command -v aiws >/dev/null 2>&1; then
|
|
14
|
-
aiws
|
|
14
|
+
aiws plan-verify
|
|
15
15
|
else
|
|
16
|
-
npx @aipper/aiws
|
|
16
|
+
npx @aipper/aiws plan-verify
|
|
17
17
|
fi
|
|
18
18
|
```
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ws-pull
|
|
3
|
-
description: Thin wrapper for `aiws
|
|
3
|
+
description: Thin wrapper for `aiws pull`
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ws-pull
|
|
7
7
|
|
|
8
|
-
Thin skill wrapper. Delegates to `aiws
|
|
8
|
+
Thin skill wrapper. Delegates to `aiws pull`. See `aiws pull --help` for details.
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
if [[ -x "./node_modules/.bin/aiws" ]]; then
|
|
12
|
-
./node_modules/.bin/aiws
|
|
12
|
+
./node_modules/.bin/aiws pull
|
|
13
13
|
elif command -v aiws >/dev/null 2>&1; then
|
|
14
|
-
aiws
|
|
14
|
+
aiws pull
|
|
15
15
|
else
|
|
16
|
-
npx @aipper/aiws
|
|
16
|
+
npx @aipper/aiws pull
|
|
17
17
|
fi
|
|
18
18
|
```
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ws-push
|
|
3
|
-
description: Thin wrapper for `aiws
|
|
3
|
+
description: Thin wrapper for `aiws push`
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ws-push
|
|
7
7
|
|
|
8
|
-
Thin skill wrapper. Delegates to `aiws
|
|
8
|
+
Thin skill wrapper. Delegates to `aiws push`. See `aiws push --help` for details.
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
if [[ -x "./node_modules/.bin/aiws" ]]; then
|
|
12
|
-
./node_modules/.bin/aiws
|
|
12
|
+
./node_modules/.bin/aiws push
|
|
13
13
|
elif command -v aiws >/dev/null 2>&1; then
|
|
14
|
-
aiws
|
|
14
|
+
aiws push
|
|
15
15
|
else
|
|
16
|
-
npx @aipper/aiws
|
|
16
|
+
npx @aipper/aiws push
|
|
17
17
|
fi
|
|
18
18
|
```
|
|
@@ -43,7 +43,12 @@ OpenCode + oMo 优先策略:
|
|
|
43
43
|
- 行为是否可能回归
|
|
44
44
|
- 边界条件 / 失败路径是否覆盖
|
|
45
45
|
- 测试是否足以支撑改动
|
|
46
|
-
|
|
46
|
+
- 是否存在明显复杂度、耦合、可维护性或性能问题
|
|
47
|
+
- **AI-Slop 检查**(source: `workflow-review-gates.json` aiSlopChecks):
|
|
48
|
+
- unnecessary_abstraction:过度抽象(单实现接口、未使用的泛化层)
|
|
49
|
+
- fake_comments:伪注释(表述代码行为但不解释 why,或与代码不一致)
|
|
50
|
+
- over_defensive:过度防御(不必要的安全检查、对不可能情况的处理)
|
|
51
|
+
- cargo_cult:货舱崇拜(照搬模式但不理解原因,如不必要的 observer/strategy)
|
|
47
52
|
3) 将结论落盘到:
|
|
48
53
|
- 默认:`changes/<change-id>/review/quality-review.md`
|
|
49
54
|
- 回退:`.agentdocs/tmp/review/quality-review.md`
|
|
@@ -3,6 +3,12 @@ name: ws-review
|
|
|
3
3
|
description: 使用时机:需要审计当前改动、查找风险时。触发词:审计、评审、review、风险检查、回归检查。注意:高风险变更应补 ws-spec-review + ws-quality-review。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
## 双审查边界
|
|
7
|
+
|
|
8
|
+
- `ws-review` 是通用评审入口
|
|
9
|
+
- **高风险或准备 finish 的变更**:必须拆为 `ws-spec-review`(流程/归因/真值完整性)+ `ws-quality-review`(行为回归/边界条件/测试覆盖),两份独立证据
|
|
10
|
+
- 单份 review 文件同时覆盖 spec 和 quality 不计为双审查
|
|
11
|
+
|
|
6
12
|
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
7
13
|
|
|
8
14
|
目标:在提交/交付前审计当前改动,对照真值文件检查是否越界,并把审计证据优先落盘到 `changes/<change-id>/review/`(若无法确定 `change-id` 再回退 `.agentdocs/tmp/review/`)。
|
|
@@ -15,6 +21,7 @@ OpenCode + oMo 优先策略:
|
|
|
15
21
|
|
|
16
22
|
阶段定位:
|
|
17
23
|
- review 阶段;负责对当前改动做规范、风险和验证完整性的审计。
|
|
24
|
+
- 双审查边界:ws-spec-review 查流程/真值归因,ws-quality-review 查行为/回归/测试。高风险或准备 finish 的任务必须同时完成两者。
|
|
18
25
|
|
|
19
26
|
必需输入:
|
|
20
27
|
- 当前 `git status` / `git diff`
|
|
@@ -38,26 +45,39 @@ OpenCode + oMo 优先策略:
|
|
|
38
45
|
步骤(建议):
|
|
39
46
|
1) 先做 preflight:定位项目根目录,读取 `AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`,输出约束摘要。
|
|
40
47
|
- 若检测到 oMo:优先让 `@oracle` 做独立审查;必要时再让 `@explore` / `@librarian` 补上下文。
|
|
41
|
-
|
|
48
|
+
1.5) **Triage**:preflight 后立即判断本 change 是否需要双审查:
|
|
49
|
+
- 需要双审查的条件:改动涉及 REQUIREMENTS 真值、跨 3+ 文件、涉及安全/数据一致性、或准备 finish
|
|
50
|
+
- 若需要双审查:在步骤 3 开始时即标注 "dual-review: required",并规划 spec-review + quality-review 两条并行路径
|
|
51
|
+
- 若不需要双审查:继续通用 review 流程,标注 "dual-review: not-required"
|
|
52
|
+
- **不得等到 step 6 才决定是否需要双审查**——风险判定必须前置
|
|
53
|
+
- **Triage 输出格式**:
|
|
54
|
+
```
|
|
55
|
+
Triage: dual-review: required | not-required
|
|
56
|
+
Rationale: <one reason>
|
|
57
|
+
Spec review scope: <what to check> (if required)
|
|
58
|
+
Quality review scope: <what to check> (if required)
|
|
59
|
+
```
|
|
60
|
+
- Findings 格式要求:每个 finding 必须有 [Critical/Warning/Info] 级别标签 + 归因到 SPEC/QUALITY/REGRESSION 类别
|
|
61
|
+
3) 基于 `git status` / `git diff`(以及你实际运行过的测试结果),对照 `AI_PROJECT.md` 与 `REQUIREMENTS.md` 检查:
|
|
42
62
|
- 是否存在越界目录改动/危险操作
|
|
43
63
|
- 是否有可复现验证命令与证据
|
|
44
64
|
- 是否维护了 `changes/<change-id>/` 或相关 `issues/*.csv`
|
|
45
65
|
- 若存在 `analysis/` / `patches/`:审查这些委托工件是否已被主 agent 理解、是否需要采用/拒绝,并把结论写入 review 文件
|
|
46
|
-
|
|
66
|
+
4) Workflow State Suffix 审计(检查 4 种后缀使用是否一致):
|
|
47
67
|
- `session` 后缀:只由 ws-dev-lite / ws-intake 写入,标记会话级进度(如 `[workflow-state:session:in_progress]`)
|
|
48
68
|
- `gate` 后缀:由 ws-dev / ws-plan-verify 写入,标记计划/实现门禁结果(如 `[workflow-state:gate:plan_passed]`)
|
|
49
69
|
- `plan` 后缀:由 ws-plan 写入,标记计划阶段状态(如 `[workflow-state:plan:in_progress]`)
|
|
50
70
|
- `gateway` 后缀:由 ws-finish / ws-deliver 写入,标记交付门禁结果(如 `[workflow-state:gateway:finish_gate_ok]`)
|
|
51
71
|
- 检查当前 change 中使用的后缀类型是否正确对应所在阶段;若出现混用(如 session 与 gate 在同一文件),在审计报告中标记异常并说明应该修正的方向。
|
|
52
|
-
|
|
72
|
+
5) 将审计落盘到(目录不存在则创建):
|
|
53
73
|
- 默认:`changes/<change-id>/review/codex-review.md`
|
|
54
74
|
- 回退:`.agentdocs/tmp/review/codex-review.md`(仅在无法确定 `change-id` 时使用)
|
|
55
75
|
- 若已有其它 reviewer 文件:不要覆盖它们;当前 reviewer 应写自己的文件或更新自己的汇总文件
|
|
56
|
-
|
|
76
|
+
6) 若 triage 标记为 `dual_review_required`,继续补齐 dual review gate:
|
|
57
77
|
- 运行/收敛 `$ws-spec-review`,落盘 `changes/<change-id>/review/spec-review.md`(或回退 `.agentdocs/tmp/review/spec-review.md`)
|
|
58
78
|
- 运行/收敛 `$ws-quality-review`,落盘 `changes/<change-id>/review/quality-review.md`(或回退 `.agentdocs/tmp/review/quality-review.md`)
|
|
59
79
|
- 不要把单个 `codex-review.md` 误当成 finish gate 已完成
|
|
60
|
-
|
|
80
|
+
7) 回复中输出:
|
|
61
81
|
- `证据(Evidence):` 证据文件路径
|
|
62
82
|
- `主要风险(Top risks):` 3–8 条(高→低)
|
|
63
83
|
- `下一步(Next):` 最小修复清单 + 最小验证命令
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ws-submodule-setup
|
|
3
|
-
description: Thin wrapper for `aiws
|
|
3
|
+
description: Thin wrapper for `aiws submodule-setup`
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ws-submodule-setup
|
|
7
7
|
|
|
8
|
-
Thin skill wrapper. Delegates to `aiws
|
|
8
|
+
Thin skill wrapper. Delegates to `aiws submodule-setup`. See `aiws submodule-setup --help` for details.
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
if [[ -x "./node_modules/.bin/aiws" ]]; then
|
|
12
|
-
./node_modules/.bin/aiws
|
|
12
|
+
./node_modules/.bin/aiws submodule-setup
|
|
13
13
|
elif command -v aiws >/dev/null 2>&1; then
|
|
14
|
-
aiws
|
|
14
|
+
aiws submodule-setup
|
|
15
15
|
else
|
|
16
|
-
npx @aipper/aiws
|
|
16
|
+
npx @aipper/aiws submodule-setup
|
|
17
17
|
fi
|
|
18
18
|
```
|
|
@@ -1,18 +1,49 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ws-verify-before-complete
|
|
3
|
-
description: Thin wrapper for `aiws
|
|
3
|
+
description: Thin wrapper for `aiws verify-bc`
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ws-verify-before-complete
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## 完成前验证 Gate
|
|
9
|
+
|
|
10
|
+
进入 `ws-finish` / `ws-handoff` 前必须确认:
|
|
11
|
+
|
|
12
|
+
- [ ] `ws-spec-review` 已完成:`test -f changes/<id>/review/spec-review.md` (→ PASS/FAIL)
|
|
13
|
+
- [ ] `ws-quality-review` 已完成:`test -f changes/<id>/review/quality-review.md` (→ PASS/FAIL)
|
|
14
|
+
- [ ] `aiws validate .` stamp 存在:`ls .agentdocs/tmp/aiws-validate/*.json 2>/dev/null` (→ PASS/FAIL)
|
|
15
|
+
- [ ] 无未关闭 Critical blocker:`grep -c 'Critical' changes/<id>/review/*.md` = 0 或已标记 resolved (→ PASS/FAIL)
|
|
16
|
+
- [ ] 评审-返工循环 handoff 记录:`test -f changes/<id>/handoff-evidence.md` 且含 rework round 记录 (→ PASS/FAIL)
|
|
17
|
+
|
|
18
|
+
## Gate Result(结构化输出)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Gate: PASS / FAIL
|
|
22
|
+
Items:
|
|
23
|
+
1. spec-review: PASS
|
|
24
|
+
2. quality-review: PASS
|
|
25
|
+
3. validate-stamp: PASS
|
|
26
|
+
4. no-critical-blocker: PASS
|
|
27
|
+
5. rework-handoff: N/A (未经过返工循环)
|
|
28
|
+
Summary: <一句话总结>
|
|
29
|
+
Action: → ws-finish / → 需补齐: <缺失项>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
任一项 FAIL 即阻断 finish;输出中必须给出具体缺失项与补救路径。
|
|
33
|
+
|
|
34
|
+
Thin skill wrapper. Delegates to `aiws verify-bc`. See `aiws verify-bc --help` for details.
|
|
9
35
|
|
|
10
36
|
```bash
|
|
11
37
|
if [[ -x "./node_modules/.bin/aiws" ]]; then
|
|
12
|
-
./node_modules/.bin/aiws
|
|
38
|
+
./node_modules/.bin/aiws verify-bc
|
|
13
39
|
elif command -v aiws >/dev/null 2>&1; then
|
|
14
|
-
aiws
|
|
40
|
+
aiws verify-bc
|
|
15
41
|
else
|
|
16
|
-
npx @aipper/aiws
|
|
42
|
+
npx @aipper/aiws verify-bc
|
|
17
43
|
fi
|
|
18
44
|
```
|
|
45
|
+
|
|
46
|
+
## 执行要求
|
|
47
|
+
|
|
48
|
+
- 按 Gate Result 结构化输出逐项验证;任一项 FAIL 即阻断 finish。
|
|
49
|
+
- finish 前门禁证据:须确认存在 spec-review.md + quality-review.md(双审查)+ 有效 validate stamp + 已关闭所有 blocker;缺任一项即阻断 finish。
|