@aipper/aiws-spec 0.0.31 → 0.0.33
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-governance-rules.json +11 -7
- package/docs/workflow-governance-rules.md +19 -19
- package/docs/workflow-governance-rules.schema.json +1 -0
- package/docs/workflow-review-gates.json +5 -5
- package/docs/workflow-review-gates.md +4 -4
- package/docs/workflow-stage-contracts.json +2 -2
- package/docs/workflow-stage-contracts.md +2 -2
- package/docs/ws-goal-contract.md +239 -0
- package/package.json +1 -1
- package/templates/workspace/.agents/skills/using-aiws/SKILL.md +8 -1
- package/templates/workspace/.agents/skills/ws-analyze/SKILL.md +1 -1
- package/templates/workspace/.agents/skills/ws-dev/SKILL.md +1 -1
- package/templates/workspace/.agents/skills/ws-goal/SKILL.md +89 -0
- package/templates/workspace/.agents/skills/ws-intake/SKILL.md +30 -11
- package/templates/workspace/.agents/skills/ws-preflight/SKILL.md +4 -3
- package/templates/workspace/.agents/skills/ws-req-review/SKILL.md +1 -1
- package/templates/workspace/.agents/skills/ws-research/SKILL.md +56 -0
- package/templates/workspace/.agents/skills/ws-review/SKILL.md +1 -1
- package/templates/workspace/.aiws/tools/ws_change_check.py +11 -4
- package/templates/workspace/.claude/commands/ws-goal.md +34 -0
- package/templates/workspace/.claude/skills/ws-intake/SKILL.md +26 -4
- package/templates/workspace/.opencode/command/ws-goal.md +39 -0
- package/templates/workspace/.opencode/command/ws-preflight.md +4 -3
- package/templates/workspace/.opencode/command/ws-req-review.md +1 -1
- package/templates/workspace/.opencode/commands/ws-preflight.md +4 -3
- package/templates/workspace/.opencode/commands/ws-req-review.md +1 -1
- package/templates/workspace/.opencode/lib/aiws-context.js +38 -4
- package/templates/workspace/.opencode/oh-my-opencode.json.example +5 -0
- package/templates/workspace/.opencode/skills/ws-intake/SKILL.md +61 -6
- package/templates/workspace/.opencode/skills/ws-preflight/SKILL.md +4 -3
- package/templates/workspace/.opencode/skills/ws-req-review/SKILL.md +1 -1
- package/templates/workspace/manifest.json +25 -20
- package/templates/workspace/tools/ws_tasks_plan.py +97 -0
|
@@ -26,6 +26,8 @@ description: 计划前置澄清(逐条冻结问题并产出 intake 草案,
|
|
|
26
26
|
|
|
27
27
|
必需输出:
|
|
28
28
|
- `Intake file:` 实际写入的 `plan/*.intake.md`
|
|
29
|
+
- `Deep Interview:` 9 维分析:Why/非目标/影响面/假设/替代方案/约束/优先级/成功度量/风险
|
|
30
|
+
- `Codebase Knowns:` 来自代码库的已知信息(通过 explore 已确认的事实、模式、配置值等,标注信息来源路径)
|
|
29
31
|
- `Current question:` 当前正在处理的问题
|
|
30
32
|
- `Open Questions:` 尚未冻结的问题列表
|
|
31
33
|
- `Frozen Decisions:` 已冻结结论
|
|
@@ -44,37 +46,54 @@ description: 计划前置澄清(逐条冻结问题并产出 intake 草案,
|
|
|
44
46
|
执行步骤(建议):
|
|
45
47
|
1) 先运行 `$ws-preflight`,读取真值文件并输出约束摘要。
|
|
46
48
|
2) 读取当前任务描述;若存在最新 `plan/*.intake.md`,先读取其中的:
|
|
49
|
+
- `Deep Interview`
|
|
47
50
|
- `Open Questions`
|
|
48
51
|
- `Resolved Questions`
|
|
49
52
|
- `Frozen Decisions`
|
|
50
53
|
- `Draft Scope`
|
|
51
54
|
- `Draft Verify`
|
|
52
|
-
3)
|
|
55
|
+
3) **Deep Interview 层**:在拆解问题前先收集高维信息:
|
|
56
|
+
a) **Why 探询**:问"为什么要做?不做会怎样?谁提出的?什么场景?"
|
|
57
|
+
b) **非目标(Non-goals)**:显式记录什么不在范围内,需用户确认
|
|
58
|
+
c) **影响面(Stakeholders)**:识别受影响的用户、模块、团队
|
|
59
|
+
d) **假设显式化**:列出隐含假设,请用户确认
|
|
60
|
+
e) **替代方案**:问"考虑过其他方案吗?为什么选这个?"
|
|
61
|
+
f) **约束挑战**:对每条约束问"如果不存在会怎样?"——区分硬约束与自设约束
|
|
62
|
+
g) **优先级**:Must-have / Should-have / Nice-to-have
|
|
63
|
+
h) **成功度量**:问"上线后怎么判断成功?"——量化指标,无法量化则记入风险
|
|
64
|
+
i) **风险预判**:识别 3-5 个最关键风险
|
|
65
|
+
j) 结果写入 intake 草案的 `Deep Interview` 小节
|
|
66
|
+
4) **探码后问**:在对每个 Open Question 提问或沟通前,先用 `explore` 检索代码库中是否已有足够信息回答该问题。探查到的已知信息记录在 intake 草案中(见输出要求的 Codebase Knowns),不再问用户。记录每个问题属于以下哪一类:
|
|
67
|
+
- `codebase: answered` — 代码库已可回答,跳过提问
|
|
68
|
+
- `codebase: partial` — 代码库有部分信息,补充提问未覆盖的部分
|
|
69
|
+
- `user: required` — 必须问用户
|
|
70
|
+
4) 初始化或续写问题队列:
|
|
53
71
|
- 把当前任务拆成 `N` 条待决问题
|
|
54
72
|
- 每条问题都要写成一句明确的决策句,而不是模糊话题
|
|
55
|
-
|
|
56
|
-
|
|
73
|
+
- 状态只允许:`open` / `in_discussion` / `frozen` / `deferred`
|
|
74
|
+
5) 选择唯一的当前问题:
|
|
57
75
|
- 优先取已有 `in_discussion`
|
|
58
|
-
|
|
59
|
-
|
|
76
|
+
- 否则取最影响 `Goal / Scope / Verify / Binding` 的 `open`
|
|
77
|
+
6) 对当前问题输出并沟通:
|
|
60
78
|
- `Current question:`
|
|
61
79
|
- `Why it matters:`
|
|
62
80
|
- `Current options / current understanding:`
|
|
63
|
-
|
|
64
|
-
|
|
81
|
+
- `Exit condition:` 这条问题在什么条件下算谈完
|
|
82
|
+
7) 只推进当前问题:
|
|
65
83
|
- 允许围绕这 1 条问题多轮问答
|
|
66
84
|
- 若用户回答引出新问题:加入 `Open Questions`
|
|
67
85
|
- 若当前问题已经有明确结论:标记为 `frozen`
|
|
68
|
-
|
|
69
|
-
|
|
86
|
+
- 若当前问题故意留到后面:标记为 `deferred`
|
|
87
|
+
8) 每次落盘 `plan/<timestamp>-<slug>.intake.md`,至少包含:
|
|
88
|
+
- `Deep Interview`
|
|
70
89
|
- `Context`
|
|
71
90
|
- `Open Questions`
|
|
72
91
|
- `Resolved Questions`
|
|
73
92
|
- `Frozen Decisions`
|
|
74
93
|
- `Draft Scope`
|
|
75
94
|
- `Draft Verify`
|
|
76
|
-
|
|
77
|
-
|
|
95
|
+
- `Ready for ws-plan: yes/no`
|
|
96
|
+
9) 判断是否可以移交给 `$ws-plan`:
|
|
78
97
|
- 若仍有关键问题未冻结:`Ready for ws-plan: no`,`Next: 继续 $ws-intake`
|
|
79
98
|
- 若关键问题已冻结,剩余仅是实现细节或已标记 `deferred`:`Ready for ws-plan: yes`,`Next: $ws-plan`
|
|
80
99
|
|
|
@@ -31,9 +31,10 @@ description: 预检(提交前快速检查与建议)
|
|
|
31
31
|
- 使用者已经知道当前仓库能否继续进入后续阶段,以及必须遵守的约束与下一步入口。
|
|
32
32
|
|
|
33
33
|
执行步骤(强制):
|
|
34
|
-
1)
|
|
35
|
-
- 优先:`git rev-parse --show-
|
|
36
|
-
-
|
|
34
|
+
1) 定位项目根目录(submodule 感知):
|
|
35
|
+
- 优先:`git rev-parse --show-superproject-working-tree`(若当前在 submodule 内则返回 superproject 根)
|
|
36
|
+
- 若为空(不在 submodule 内):`git rev-parse --show-toplevel`
|
|
37
|
+
- 若两者都失败:停止并让用户确认当前目录是否为项目根(不要猜测)。
|
|
37
38
|
2) 在项目根目录读取以下文件(存在则必须读取;缺失则明确报告缺失项,不要臆测内容):
|
|
38
39
|
- `AI_PROJECT.md`
|
|
39
40
|
- `REQUIREMENTS.md`
|
|
@@ -8,7 +8,7 @@ description: 需求评审(对齐真值与验收)
|
|
|
8
8
|
目标:在不修改任何文件的前提下,对 `REQUIREMENTS.md` 做一次整体 QA,输出缺口/冲突/风险,减少实现漂移。
|
|
9
9
|
|
|
10
10
|
执行步骤(强制):
|
|
11
|
-
1)
|
|
11
|
+
1) 定位项目根目录:先尝试 `git rev-parse --show-superproject-working-tree`(submodule 感知上溯到 superproject 根);若为空再用 `git rev-parse --show-toplevel`。都失败则停止并让用户确认根目录。
|
|
12
12
|
2) 读取(存在则必须读取;缺失则明确列出,不要臆测):
|
|
13
13
|
- `AI_PROJECT.md`
|
|
14
14
|
- `REQUIREMENTS.md`
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ws-research
|
|
3
|
+
description: 使用时机:需要技术调研、定位影响面、收集实现信息但不直接改代码时。触发词:调研、研究、research、分析依赖、影响面、技术方案。注意:产物只落盘 changes/<id>/analysis/,不修改业务文件。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
7
|
+
|
|
8
|
+
目标:在正式实现前,对不明确的技术问题做只读调研,并把结论落盘为可追溯的分析产物。
|
|
9
|
+
|
|
10
|
+
定位:
|
|
11
|
+
- ws-dev / ws-plan 的辅助入口,不是独立 workflow stage。
|
|
12
|
+
- 只读探索代码库、外部文档或依赖关系,不直接修改业务文件。
|
|
13
|
+
- 若分析过程中发现需要改代码,必须退出本 Skill 并回到 ws-dev 或 ws-plan。
|
|
14
|
+
|
|
15
|
+
必需输入:
|
|
16
|
+
- 真值文件:`AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`
|
|
17
|
+
- 当前绑定到 `Req_ID` 或 `Problem_ID` 的 change 上下文
|
|
18
|
+
- 明确的调研问题清单
|
|
19
|
+
|
|
20
|
+
必需输出:
|
|
21
|
+
- 分析报告落盘:`changes/<id>/analysis/<timestamp>-research.md`
|
|
22
|
+
- 报告中必须包含:
|
|
23
|
+
- 调研问题与结论
|
|
24
|
+
- 信息来源(文件路径/外部文档链接)
|
|
25
|
+
- 不确定项与风险标记
|
|
26
|
+
- 对后续实现的建议或阻断项
|
|
27
|
+
- `Next:` 指向 ws-dev、ws-plan 或 ws-review
|
|
28
|
+
|
|
29
|
+
阻断条件:
|
|
30
|
+
- 没有明确的调研问题
|
|
31
|
+
- 当前不在 change 上下文中
|
|
32
|
+
- 调研过程中发现需要写代码(应回到 ws-dev)
|
|
33
|
+
- 调研深度超出本次 change scope(应记录原因并回到 ws-plan 更新范围)
|
|
34
|
+
|
|
35
|
+
完成判定:
|
|
36
|
+
- 分析报告已落盘到 `changes/<id>/analysis/`
|
|
37
|
+
- 报告中问题与结论一一对应
|
|
38
|
+
- `Next` 已给出明确路由
|
|
39
|
+
|
|
40
|
+
步骤(建议):
|
|
41
|
+
1) 先读取真值文件,确认 change 上下文与调研问题
|
|
42
|
+
2) 只读探索相关代码库区域:
|
|
43
|
+
- 用搜索工具定位关键文件/模块
|
|
44
|
+
- 阅读相关代码片段
|
|
45
|
+
- 必要时查阅外部文档
|
|
46
|
+
3) 汇总发现,标注不确定项:
|
|
47
|
+
- 对每个问题给出结论或待确认标记
|
|
48
|
+
- 标明信息来源(文件路径/行号/外部链接)
|
|
49
|
+
4) 落盘分析报告到 `changes/<id>/analysis/<timestamp>-research.md`
|
|
50
|
+
5) 回到主流程:`$ws-dev` 或 `$ws-plan`
|
|
51
|
+
|
|
52
|
+
安全:
|
|
53
|
+
- 不修改任何业务文件
|
|
54
|
+
- 不写入 secrets
|
|
55
|
+
- 不执行破坏性命令
|
|
56
|
+
- 不确定的结论必须显式标注
|
|
@@ -31,7 +31,7 @@ description: 评审(提交前审计与证据落盘)
|
|
|
31
31
|
- 审计证据已落盘,主要风险和下一步已明确,可作为 commit/deliver 前置输入。
|
|
32
32
|
|
|
33
33
|
步骤(建议):
|
|
34
|
-
1) 先做 preflight
|
|
34
|
+
1) 先做 preflight:定位项目根目录(submodule 感知:若在 submodule 内自动上溯到 superproject 根),读取 `AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`,输出约束摘要。
|
|
35
35
|
2) 基于 `git status` / `git diff`(以及你实际运行过的测试结果),对照 `AI_PROJECT.md` 与 `REQUIREMENTS.md` 检查:
|
|
36
36
|
- 是否存在越界目录改动/危险操作
|
|
37
37
|
- 是否有可复现验证命令与证据
|
|
@@ -323,6 +323,13 @@ def extract_first_id(labels: List[str], text: str) -> str:
|
|
|
323
323
|
return ""
|
|
324
324
|
|
|
325
325
|
|
|
326
|
+
def normalize_optional_id(value: str) -> str:
|
|
327
|
+
normalized = (value or "").strip()
|
|
328
|
+
if normalized.upper() in {"N/A", "NA", "NONE", "NULL", "-"}:
|
|
329
|
+
return ""
|
|
330
|
+
return normalized
|
|
331
|
+
|
|
332
|
+
|
|
326
333
|
def split_declared_values(value: str) -> List[str]:
|
|
327
334
|
parts = re.split(r"[,;\n]+", value or "")
|
|
328
335
|
out: List[str] = []
|
|
@@ -910,8 +917,8 @@ def validate_change(
|
|
|
910
917
|
warnings.append("proposal.md does not reference AI_WORKSPACE.md (recommended)")
|
|
911
918
|
|
|
912
919
|
change_id_decl = extract_id("Change_ID", t)
|
|
913
|
-
req_id = extract_id("Req_ID", t)
|
|
914
|
-
prob_id = extract_id("Problem_ID", t)
|
|
920
|
+
req_id = normalize_optional_id(extract_id("Req_ID", t))
|
|
921
|
+
prob_id = normalize_optional_id(extract_id("Problem_ID", t))
|
|
915
922
|
contract_row_decl = extract_first_id(["Contract_Row", "Contract_Row(s)"], t)
|
|
916
923
|
plan_file_decl = extract_first_id(["Plan_File", "Plan file"], t)
|
|
917
924
|
evidence_path_decl = extract_first_id(["Evidence_Path", "Evidence_Path(s)"], t)
|
|
@@ -1009,8 +1016,8 @@ def validate_change(
|
|
|
1009
1016
|
else:
|
|
1010
1017
|
plan_text = read_text(plan_abs)
|
|
1011
1018
|
plan_change_id = extract_id("Change_ID", plan_text)
|
|
1012
|
-
plan_req_id = extract_id("Req_ID", plan_text)
|
|
1013
|
-
plan_prob_id = extract_id("Problem_ID", plan_text)
|
|
1019
|
+
plan_req_id = normalize_optional_id(extract_id("Req_ID", plan_text))
|
|
1020
|
+
plan_prob_id = normalize_optional_id(extract_id("Problem_ID", plan_text))
|
|
1014
1021
|
plan_contract_row = extract_first_id(["Contract_Row", "Contract_Row(s)"], plan_text)
|
|
1015
1022
|
plan_file_from_plan = extract_first_id(["Plan_File", "Plan file"], plan_text)
|
|
1016
1023
|
plan_evidence_path = extract_first_id(["Evidence_Path", "Evidence_Path(s)"], plan_text)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!-- AIWS_MANAGED_BEGIN:claude:ws-goal -->
|
|
2
|
+
# ws goal
|
|
3
|
+
|
|
4
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
5
|
+
|
|
6
|
+
目标:
|
|
7
|
+
- 在 AIWS 约束下完成一个目标导向的自主执行闭环。
|
|
8
|
+
- 启动时自动恢复未完成的 goal。
|
|
9
|
+
|
|
10
|
+
执行建议:
|
|
11
|
+
0) 检查 `.aiws/goals/` 目录:
|
|
12
|
+
a) 若用户仅查询状态(无明确目标),列出所有 goal 文件及其 status 字段,然后结束。
|
|
13
|
+
b) 若存在 status=active 或 status=paused 的 goal 文件,优先读取并恢复执行。
|
|
14
|
+
1) 先运行 `/ws-preflight` 对齐真值文件(`AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`)。
|
|
15
|
+
2) 接受用户输入的 goal objective。
|
|
16
|
+
3) 按 `ws-goal-contract.md` 的目标模板写入 `.aiws/goals/<goal-id>.md` 工件文件。
|
|
17
|
+
4) 输出 completion audit checklist(含验真步骤)。
|
|
18
|
+
5) **Scope Assessment + 路由**:评估目标复杂度,自动选择执行路径:
|
|
19
|
+
a) 简单(≤5 文件、配置/doc 为主、低风险)→ 直行:后续步骤 6-8 auto-finish 闭环
|
|
20
|
+
b) 复杂(多模块、代码改动 >5 文件、架构/安全/迁移风险)→ 自动触发 `ws-plan` 启动 change 流水线,完成后更新 goal status=complete
|
|
21
|
+
c) 路由决策记入 goal 文件 Audit Trail
|
|
22
|
+
6) 建议续跑方式:简单路径直行 auto-finish;复杂路径进入 change 流水线后建议 ws-dev
|
|
23
|
+
7) 每轮结束后自动执行 completion audit,确认目标是否完成。
|
|
24
|
+
8) 若 completion audit 确认 goal 达成,自动执行闭环 pipeline:
|
|
25
|
+
a) Review 检查(按改动类型):
|
|
26
|
+
- 配置/文档/规范类(markdown):内容一致性、引用完整性、内容正确性、无 secrets、格式统一
|
|
27
|
+
- 代码类(ts/js/py 等):lint/typecheck 通过、符合现有代码模式、无 secrets、测试通过或覆盖缺口已记录
|
|
28
|
+
- 混合类:以上两种合并
|
|
29
|
+
b) 简单路径:git add → commit → push,更新 goal status=complete
|
|
30
|
+
c) 复杂路径:走 ws-commit → ws-finish → archive change,更新 goal status=complete
|
|
31
|
+
d) 不通过:记录 blocker → 继续 fix 循环
|
|
32
|
+
<!-- AIWS_MANAGED_END:claude:ws-goal -->
|
|
33
|
+
|
|
34
|
+
可在下方追加本项目对 Claude Code 的额外说明(托管块外内容会被保留)。
|
|
@@ -10,22 +10,44 @@ description: 计划前置澄清(逐条冻结问题并产出 intake 草案,
|
|
|
10
10
|
- 采用“一题一线程”模式推进:每次只处理 1 个问题,允许该问题多轮往返,直到形成明确结论。
|
|
11
11
|
- 产出一份可被 `/ws-plan` 消费的轻量草案:`plan/<timestamp>-<slug>.intake.md`。
|
|
12
12
|
|
|
13
|
+
## Deep Interview 层(前置探询)
|
|
14
|
+
|
|
15
|
+
在逐题澄清前,先做一轮 Deep Interview 收集高维信息:
|
|
16
|
+
|
|
17
|
+
1. **Why 探询**:问"为什么要做?不做会怎样?谁提出的?什么场景?"——理解动机,追溯 trigger。
|
|
18
|
+
2. **非目标(Non-goals)**:显式记录什么不在范围内,防止 scope creep。需用户确认。
|
|
19
|
+
3. **影响面(Stakeholders)**:识别受影响的用户、模块、团队。
|
|
20
|
+
4. **假设显式化**:列出隐含假设,逐条请用户确认。
|
|
21
|
+
5. **替代方案**:问"考虑过其他方案吗?为什么选这个?"未探索则标记为风险。
|
|
22
|
+
6. **约束挑战**:对每条约束问"如果不存在会怎样?"——区分硬约束与自设约束。
|
|
23
|
+
7. **优先级**:Must-have / Should-have / Nice-to-have,明确 scope 底线。
|
|
24
|
+
8. **成功度量**:问"上线后怎么判断成功?"——量化指标,无法量化则记入风险。
|
|
25
|
+
9. **风险预判**:识别 3-5 个最关键风险,写入 intake 草案。
|
|
26
|
+
|
|
27
|
+
输出:以上 9 项归入 intake 草案的 `Deep Interview` 小节。
|
|
28
|
+
|
|
13
29
|
执行要求:
|
|
14
30
|
1) 先读 `AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`,必要时先 `/ws-preflight`。
|
|
15
31
|
2) 若存在最新 `plan/*.intake.md`,先续写它;否则新建一份 intake 草案。
|
|
16
32
|
3) 把当前任务拆成 `Open Questions`,状态只允许 `open / in_discussion / frozen / deferred`。
|
|
17
|
-
4)
|
|
33
|
+
4) **探码后问**:在对每个 Open Question 提问或沟通前,先用 `explore` 检索代码库中是否已有足够信息回答该问题。探查到的已知信息记录在 intake 草案中,不再问用户。标记每个问题的信息来源:
|
|
34
|
+
- `codebase: answered` — 代码库已可回答,跳过提问
|
|
35
|
+
- `codebase: partial` — 代码库有部分信息,补充提问未覆盖的部分
|
|
36
|
+
- `user: required` — 必须问用户
|
|
37
|
+
5) 每次只推进 1 个当前问题,并显式输出:
|
|
18
38
|
- `Current question:`
|
|
19
39
|
- `Why it matters:`
|
|
20
40
|
- `Current options / current understanding:`
|
|
21
41
|
- `Exit condition:`
|
|
22
|
-
|
|
23
|
-
|
|
42
|
+
6) 当前问题在没有被标记成 `frozen` 或 `deferred` 前,不进入下一题。
|
|
43
|
+
7) 每轮都要把 intake 草案写盘,至少包含:
|
|
44
|
+
- `Deep Interview` — 9 维分析:Why/非目标/影响面/假设/替代方案/约束/优先级/成功度量/风险
|
|
24
45
|
- `Context`
|
|
46
|
+
- `Codebase Knowns` — 来自代码库的已知信息:通过 explore 已确认的事实、现有模式、配置值等。标注信息来源路径。
|
|
25
47
|
- `Open Questions`
|
|
26
48
|
- `Resolved Questions`
|
|
27
49
|
- `Frozen Decisions`
|
|
28
50
|
- `Draft Scope`
|
|
29
51
|
- `Draft Verify`
|
|
30
52
|
- `Ready for ws-plan: yes/no`
|
|
31
|
-
|
|
53
|
+
8) 若关键问题已冻结:`Next` 指向 `/ws-plan`;否则继续 `/ws-intake`。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 目标协议:设定可审计的 goal 目标并执行完成闭环
|
|
3
|
+
---
|
|
4
|
+
<!-- AIWS_MANAGED_BEGIN:opencode:ws-goal -->
|
|
5
|
+
# ws goal
|
|
6
|
+
|
|
7
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
8
|
+
|
|
9
|
+
目标:
|
|
10
|
+
- 将用户需求转化为可审计的 goal 目标,按 ws-goal-contract.md 的目标模板写入目标文件,驱动完成闭环。
|
|
11
|
+
|
|
12
|
+
前置条件:
|
|
13
|
+
1) 先运行 `/ws-preflight`(对齐 `AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`)。
|
|
14
|
+
|
|
15
|
+
执行流程:
|
|
16
|
+
0) 检查 `.aiws/goals/` 目录:
|
|
17
|
+
a) 若用户仅查询状态(无明确目标),列出所有 goal 文件及其 status 字段,然后结束。
|
|
18
|
+
b) 若存在 status=active 或 status=paused 的 goal 文件,优先读取并恢复执行,不再新建 goal。
|
|
19
|
+
1) 读取真值文件(`AI_PROJECT.md`、`REQUIREMENTS.md`、`AI_WORKSPACE.md`),确认项目规则与边界。
|
|
20
|
+
2) 接受用户输入的 goal objective,明确目标范围与验收标准。
|
|
21
|
+
3) 按 ws-goal-contract.md 的目标模板生成目标文件,写入 `.aiws/goals/<goal-id>.md`。
|
|
22
|
+
4) 输出 completion audit checklist,列出每个 goal 的完成标准与验证方式。
|
|
23
|
+
5) **Scope Assessment + 路由**:评估目标复杂度,自动选择执行路径:
|
|
24
|
+
a) 简单(≤5 文件、配置/doc/规范为主、低风险)→ 直行:后续步骤 6-8 auto-finish 闭环
|
|
25
|
+
b) 复杂(多模块、代码改动 >5 文件、架构/安全/迁移风险)→ 自动触发 `ws-plan` 启动 change 流水线(ws-plan → ws-dev → review → ws-commit → ws-finish),完成后更新 goal status=complete
|
|
26
|
+
c) 将路由决策写入 goal 文件 Audit Trail
|
|
27
|
+
6) 建议续跑方式:简单路径直行 auto-finish;复杂路径进入 change 流水线后建议 `ws-dev`
|
|
28
|
+
7) 每轮 execution 结束后执行 completion audit,比对 checklist 判断 goal 是否达成;未达成则继续下一轮。
|
|
29
|
+
8) 若 completion audit 确认 goal 达成,自动执行闭环 pipeline:
|
|
30
|
+
a) Review 检查(按改动类型):
|
|
31
|
+
- 配置/文档/规范类(markdown):内容一致性、引用完整性、内容正确性、无 secrets、格式统一
|
|
32
|
+
- 代码类(ts/js/py 等):lint/typecheck 通过、符合现有代码模式、无 secrets、测试通过或覆盖缺口已记录
|
|
33
|
+
- 混合类:以上两种合并
|
|
34
|
+
b) 简单路径:`git add` 目标产出文件 → `git commit -m "goal(<goal-id>): <objective 摘要>"` → `git push` → 更新 goal status=complete
|
|
35
|
+
c) 复杂路径:走 `ws-commit` → `ws-finish` → archive change → 更新 goal status=complete
|
|
36
|
+
d) 不通过:记录 blocker → 继续 fix 循环
|
|
37
|
+
<!-- AIWS_MANAGED_END:opencode:ws-goal -->
|
|
38
|
+
|
|
39
|
+
可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
|
|
@@ -9,9 +9,10 @@ description: 预检:读取真值文件并输出约束摘要
|
|
|
9
9
|
目标:在开始任何“写代码/改配置/落盘文件”之前,对齐工作区真值文件,避免规则漂移。
|
|
10
10
|
|
|
11
11
|
执行步骤(强制):
|
|
12
|
-
1)
|
|
13
|
-
- 优先:`git rev-parse --show-
|
|
14
|
-
-
|
|
12
|
+
1) 定位项目根目录(submodule 感知):
|
|
13
|
+
- 优先:`git rev-parse --show-superproject-working-tree`(submodule 内上溯到 superproject 根)
|
|
14
|
+
- 若为空:`git rev-parse --show-toplevel`
|
|
15
|
+
- 若两者都失败:停止并让用户确认当前目录是否为项目根(不要猜测)。
|
|
15
16
|
2) 在项目根目录读取以下文件(存在则必须读取;缺失则明确报告缺失项,不要臆测内容):
|
|
16
17
|
- `AI_PROJECT.md`
|
|
17
18
|
- `REQUIREMENTS.md`
|
|
@@ -9,7 +9,7 @@ description: 需求评审:对 REQUIREMENTS 做整体 QA(不改文件)
|
|
|
9
9
|
目标:在不修改任何文件的前提下,对 `REQUIREMENTS.md` 做一次整体 QA,输出缺口/冲突/风险,减少实现漂移。
|
|
10
10
|
|
|
11
11
|
执行步骤(强制):
|
|
12
|
-
1)
|
|
12
|
+
1) 定位项目根目录:先尝试 `git rev-parse --show-superproject-working-tree`(submodule 感知上溯);若为空再用 `git rev-parse --show-toplevel`。都失败则停止并让用户确认根目录。
|
|
13
13
|
2) 读取(存在则必须读取;缺失则明确列出,不要臆测):
|
|
14
14
|
- `AI_PROJECT.md`
|
|
15
15
|
- `REQUIREMENTS.md`
|
|
@@ -9,9 +9,10 @@ description: 预检:读取真值文件并输出约束摘要
|
|
|
9
9
|
目标:在开始任何“写代码/改配置/落盘文件”之前,对齐工作区真值文件,避免规则漂移。
|
|
10
10
|
|
|
11
11
|
执行步骤(强制):
|
|
12
|
-
1)
|
|
13
|
-
- 优先:`git rev-parse --show-
|
|
14
|
-
-
|
|
12
|
+
1) 定位项目根目录(submodule 感知):
|
|
13
|
+
- 优先:`git rev-parse --show-superproject-working-tree`(submodule 内上溯到 superproject 根)
|
|
14
|
+
- 若为空:`git rev-parse --show-toplevel`
|
|
15
|
+
- 若两者都失败:停止并让用户确认当前目录是否为项目根(不要猜测)。
|
|
15
16
|
2) 在项目根目录读取以下文件(存在则必须读取;缺失则明确报告缺失项,不要臆测内容):
|
|
16
17
|
- `AI_PROJECT.md`
|
|
17
18
|
- `REQUIREMENTS.md`
|
|
@@ -9,7 +9,7 @@ description: 需求评审:对 REQUIREMENTS 做整体 QA(不改文件)
|
|
|
9
9
|
目标:在不修改任何文件的前提下,对 `REQUIREMENTS.md` 做一次整体 QA,输出缺口/冲突/风险,减少实现漂移。
|
|
10
10
|
|
|
11
11
|
执行步骤(强制):
|
|
12
|
-
1)
|
|
12
|
+
1) 定位项目根目录:先尝试 `git rev-parse --show-superproject-working-tree`(submodule 感知上溯);若为空再用 `git rev-parse --show-toplevel`。都失败则停止并让用户确认根目录。
|
|
13
13
|
2) 读取(存在则必须读取;缺失则明确列出,不要臆测):
|
|
14
14
|
- `AI_PROJECT.md`
|
|
15
15
|
- `REQUIREMENTS.md`
|
|
@@ -833,10 +833,44 @@ Read and follow the context below.
|
|
|
833
833
|
|
|
834
834
|
const activeChange = ctx.getActiveChange()
|
|
835
835
|
if (activeChange) {
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
836
|
+
// Prefer STATE.md (derived from journal by aiws change state --write)
|
|
837
|
+
let stateContent = ""
|
|
838
|
+
try {
|
|
839
|
+
const statePath = join(ctx.directory, ".aiws", "changes", activeChange.id, "STATE.md")
|
|
840
|
+
if (existsSync(statePath)) {
|
|
841
|
+
stateContent = readFileSync(statePath, "utf8")
|
|
842
|
+
}
|
|
843
|
+
} catch {
|
|
844
|
+
// STATE.md not available, fall back to phase summary
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
if (stateContent) {
|
|
848
|
+
parts.push("<change-state-state-md>")
|
|
849
|
+
parts.push("## Current Change State (from STATE.md)")
|
|
850
|
+
parts.push(stateContent.trimEnd())
|
|
851
|
+
parts.push("</change-state-state-md>")
|
|
852
|
+
} else {
|
|
853
|
+
const phaseSummary = ctx.getPhaseSummary(activeChange.id)
|
|
854
|
+
parts.push("<change-context>")
|
|
855
|
+
parts.push(phaseSummary)
|
|
856
|
+
parts.push("</change-context>")
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
// .ws-change.json baseline
|
|
860
|
+
try {
|
|
861
|
+
const wsChangePath = join(ctx.directory, ".aiws", "changes", activeChange.id, ".ws-change.json")
|
|
862
|
+
if (existsSync(wsChangePath)) {
|
|
863
|
+
const wsChangeRaw = readFileSync(wsChangePath, "utf8")
|
|
864
|
+
const wsChange = JSON.parse(wsChangeRaw)
|
|
865
|
+
parts.push("<change-baseline>")
|
|
866
|
+
parts.push("## Change Baseline (.ws-change.json)")
|
|
867
|
+
parts.push(`Base Branch: ${wsChange.base_branch || "unknown"}`)
|
|
868
|
+
parts.push(`Template ID: ${wsChange.template_id || "unknown"}`)
|
|
869
|
+
parts.push("</change-baseline>")
|
|
870
|
+
}
|
|
871
|
+
} catch {
|
|
872
|
+
// .ws-change.json not available
|
|
873
|
+
}
|
|
840
874
|
|
|
841
875
|
// Continuation resume recommendation
|
|
842
876
|
try {
|
|
@@ -55,12 +55,17 @@
|
|
|
55
55
|
"git diff"
|
|
56
56
|
],
|
|
57
57
|
"write_allow_paths": [
|
|
58
|
+
".aiws/tmp/",
|
|
59
|
+
".aiws/changes/*/analysis/",
|
|
60
|
+
".aiws/changes/*/review/",
|
|
61
|
+
".aiws/changes/*/evidence/",
|
|
58
62
|
".agentdocs/tmp/",
|
|
59
63
|
"changes/*/analysis/",
|
|
60
64
|
"changes/*/review/",
|
|
61
65
|
"changes/*/evidence/"
|
|
62
66
|
],
|
|
63
67
|
"deny_paths": [
|
|
68
|
+
".aiws/secrets/",
|
|
64
69
|
"secrets/",
|
|
65
70
|
".env*"
|
|
66
71
|
],
|
|
@@ -10,6 +10,47 @@ description: 使用时机:新需求需要逐条澄清、冻结问题时。触
|
|
|
10
10
|
- 采用“一题一线程”模式推进:每次只处理 1 个问题,允许该问题多轮往返,直到形成明确结论。
|
|
11
11
|
- 产出一份可被 `/ws-plan` 消费的轻量草案:`plan/<timestamp>-<slug>.intake.md`。
|
|
12
12
|
|
|
13
|
+
## Deep Interview 层(前置探询)
|
|
14
|
+
|
|
15
|
+
在逐题澄清前,先做一轮 Deep Interview 收集高维信息:
|
|
16
|
+
|
|
17
|
+
### 1. Why 探询
|
|
18
|
+
先问"为什么要做这个?背后的业务/用户价值是什么?"——理解动机后再谈方案。延伸探询:
|
|
19
|
+
- "如果不做这个,会有什么后果?"(量化不做的代价,确认 urgency)
|
|
20
|
+
- "这个需求最早是谁提出的?在什么场景下触发的?"(追溯原始 trigger,避免需求被转述变形)
|
|
21
|
+
|
|
22
|
+
### 2. 非目标(Non-goals)
|
|
23
|
+
显式记录什么不在本次范围内——防止 scope creep 和后续争论。
|
|
24
|
+
例如:"这次不做用户权限管理,只做内容展示层""这个版本不做国际化"。
|
|
25
|
+
非目标与目标同等重要,需用户确认后写入 intake 草案。
|
|
26
|
+
|
|
27
|
+
### 3. 影响面(Stakeholders)
|
|
28
|
+
识别这个改动会影响谁:
|
|
29
|
+
- 终端用户(使用行为是否会变?)
|
|
30
|
+
- 其他模块或系统(API 耦合、数据依赖)
|
|
31
|
+
- 其他团队(是否需要跨团队协调?谁需要参与评审?)
|
|
32
|
+
|
|
33
|
+
### 4. 假设显式化
|
|
34
|
+
从当前理解中识别隐含假设,逐条列出并请用户确认。例如:你假设了用户已登录/有权限;你假设了数据规模不超过 X;你假设了这个功能只有 Y 场景用到。
|
|
35
|
+
|
|
36
|
+
### 5. 替代方案
|
|
37
|
+
在选定方案前,先问"是否考虑过其他方案?为什么选了当前这个?"——记录已探明的替代路径和淘汰理由。
|
|
38
|
+
如果用户明确没考虑过替代方案,在 intake 草案中标记 `Alternatives not explored` 作为风险项。
|
|
39
|
+
|
|
40
|
+
### 6. 约束挑战
|
|
41
|
+
对每条约束问"如果这条约束不存在会怎样?"——区分硬约束(不可变)和自设约束(可协商)。
|
|
42
|
+
|
|
43
|
+
### 7. 优先级
|
|
44
|
+
Must-have / Should-have / Nice-to-have 三层分类,明确 scope 底线。
|
|
45
|
+
|
|
46
|
+
### 8. 成功度量
|
|
47
|
+
不仅仅是"验收标准通过",更要问"这个功能上线后,怎么判断它成功了?"——量化指标(DAU、转化率、响应时间、错误率等)。如果无法量化则记入风险。
|
|
48
|
+
|
|
49
|
+
### 9. 风险预判
|
|
50
|
+
识别 3-5 个最关键风险(技术方案、时间窗口、外部依赖、安全合规),写入 intake 草案。
|
|
51
|
+
|
|
52
|
+
输出:以上 9 项归入 intake 草案的 `Deep Interview` 小节。
|
|
53
|
+
|
|
13
54
|
## 发散-收敛两子阶段
|
|
14
55
|
|
|
15
56
|
当需求模糊、方向不明确时,intake 分两子阶段推进:
|
|
@@ -18,6 +59,12 @@ description: 使用时机:新需求需要逐条澄清、冻结问题时。触
|
|
|
18
59
|
- 目标:快速探索 2-3 个可能方向,不深入任何单一方向
|
|
19
60
|
- 输出:每个方向的 1-2 段摘要 + 关键风险 + 依赖
|
|
20
61
|
- 时限:不超过 3 轮对话
|
|
62
|
+
- **探码前问**:在向用户提问前,先使用 `explore` agent 探查代码库中是否已有答案。需要探查的维度包括:
|
|
63
|
+
- 现有配置文件(`AI_PROJECT.md`、`REQUIREMENTS.md`、`AI_WORKSPACE.md`、`package.json`、`tsconfig.json` 等)
|
|
64
|
+
- 已有实现模式(grep 关键词、查找类似功能的实现文件)
|
|
65
|
+
- 已有文档或注释(相关模块的 README、代码注释)
|
|
66
|
+
- 已有测试文件(理解测试模式和边界条件)
|
|
67
|
+
- 探查到的信息直接作为发散阶段的输入,不需要再向用户重复确认已经在代码库中找到的事实。
|
|
21
68
|
|
|
22
69
|
### 收敛阶段(Converge)
|
|
23
70
|
- 目标:从发散结果中选择 1 个方向,逐条冻结具体问题
|
|
@@ -43,28 +90,36 @@ description: 使用时机:新需求需要逐条澄清、冻结问题时。触
|
|
|
43
90
|
1) 先读 `AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md`,必要时先 `/ws-preflight`。
|
|
44
91
|
2) 若存在最新 `plan/*.intake.md`,先续写它;否则新建一份 intake 草案。
|
|
45
92
|
3) 把当前任务拆成 `Open Questions`,状态只允许 `open / in_discussion / frozen / deferred`。
|
|
46
|
-
|
|
93
|
+
|
|
94
|
+
4) **探码后问**:在对每个 Open Question 提问前,先 spawn `explore` agent 探查代码库。如果代码库中已有足以回答该问题的信息,在 intake 草案的相应章节记录该信息,并跳过该问题的提问。只有当代码库无法回答时,才把该问题交给用户。记录每个问题属于以下哪一类:
|
|
95
|
+
- `codebase: answered` — 代码库已可回答,跳过提问
|
|
96
|
+
- `codebase: partial` — 代码库有部分信息,补充提问未覆盖的部分
|
|
97
|
+
- `user: required` — 必须问用户
|
|
98
|
+
|
|
99
|
+
5) 每次只推进 1 个当前问题,并显式输出:
|
|
47
100
|
- `Current question:`
|
|
48
101
|
- `Why it matters:`
|
|
49
102
|
- `Current options / current understanding:`
|
|
50
103
|
- `Exit condition:`
|
|
51
104
|
- 每个问题独立线程:在未标记 frozen/deferred 前,不进入下一题。问答往返不限轮数,但一次只处理一个维度的决策。
|
|
52
|
-
|
|
53
|
-
|
|
105
|
+
6) 若用户一次提出多个问题,必须显式排队:列出所有问题编号,按顺序逐个处理;不得同时推进多个问题的讨论。输出格式:`Queued questions: #1, #2, ... | Current: #1`
|
|
106
|
+
7) 每轮都要把 intake 草案写盘,至少包含:
|
|
107
|
+
- `Deep Interview` — 9 维分析:Why/非目标/影响面/假设/替代方案/约束/优先级/成功度量/风险
|
|
54
108
|
- `Context`
|
|
109
|
+
- `Codebase Knowns` — 来自代码库的已知信息:在提问前通过 explore 已确认的事实、现有模式、配置值等。标注每项的信息来源路径
|
|
55
110
|
- `Open Questions`
|
|
56
111
|
- `Resolved Questions`
|
|
57
112
|
- `Frozen Decisions`
|
|
58
113
|
- `Draft Scope`
|
|
59
114
|
- `Draft Verify`
|
|
60
115
|
- `Ready for ws-plan: yes/no`
|
|
61
|
-
|
|
116
|
+
8) 错误状态节点(Error States):
|
|
62
117
|
- 在 intake 草案中专设 `Error States` 小节,覆盖已知失败模式:
|
|
63
118
|
- 网络/超时/第三方依赖不可用时的系统行为
|
|
64
119
|
- 数据一致性(并发写入、部分失败、脏数据)
|
|
65
120
|
- 输入校验边界(空、超大、非预期类型)
|
|
66
121
|
- 若识别到需要回滚的场景:在 `Error States` 中写明回滚条件与回滚方式。
|
|
67
|
-
|
|
122
|
+
9) 回滚规范(Rollback Spec):
|
|
68
123
|
- 当 intake 涉及现有数据迁移、API 契约变更、配置漂移修复时,必须包含 `Rollback Plan` 小节。
|
|
69
124
|
- `Rollback Plan` 至少包含:触发条件、回滚步骤、验证回滚成功的方式、副作用清单。
|
|
70
|
-
|
|
125
|
+
10) 若关键问题已冻结:`Next` 指向 `/ws-plan`;否则继续 `/ws-intake`。
|
|
@@ -32,9 +32,10 @@ description: 使用时机:新会话开始、仓库首次操作时。触发词
|
|
|
32
32
|
- 使用者已经知道当前仓库能否继续进入后续阶段,以及必须遵守的约束与下一步入口。
|
|
33
33
|
|
|
34
34
|
执行步骤(强制):
|
|
35
|
-
1)
|
|
36
|
-
- 优先:`git rev-parse --show-
|
|
37
|
-
-
|
|
35
|
+
1) 定位项目根目录(submodule 感知):
|
|
36
|
+
- 优先:`git rev-parse --show-superproject-working-tree`(submodule 内上溯到 superproject 根)
|
|
37
|
+
- 若为空:`git rev-parse --show-toplevel`
|
|
38
|
+
- 若两者都失败:停止并让用户确认当前目录是否为项目根(不要猜测)。
|
|
38
39
|
2) 在项目根目录读取以下文件(存在则必须读取;缺失则明确报告缺失项,不要臆测内容):
|
|
39
40
|
- `AI_PROJECT.md`
|
|
40
41
|
- `REQUIREMENTS.md`
|
|
@@ -8,7 +8,7 @@ description: 使用时机:需要评审需求、验收条件、合同时。触
|
|
|
8
8
|
目标:在不修改任何文件的前提下,对 `REQUIREMENTS.md` 做一次整体 QA,输出缺口/冲突/风险,减少实现漂移。
|
|
9
9
|
|
|
10
10
|
执行步骤(强制):
|
|
11
|
-
1)
|
|
11
|
+
1) 定位项目根目录:先尝试 `git rev-parse --show-superproject-working-tree`(submodule 感知上溯);若为空再用 `git rev-parse --show-toplevel`。都失败则停止并让用户确认根目录。
|
|
12
12
|
2) 读取(存在则必须读取;缺失则明确列出,不要臆测):
|
|
13
13
|
- `AI_PROJECT.md`
|
|
14
14
|
- `REQUIREMENTS.md`
|