@aipper/aiws-spec 0.0.32 → 0.0.34
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/aiws-bootstrap-routing-design.md +5 -50
- package/docs/aiws-governance-positioning.md +1 -1
- package/docs/cli-interface.md +13 -73
- package/docs/collaboration-artifacts.md +2 -2
- package/docs/opencode-autonomous-swarm.md +0 -2
- package/docs/opencode-omo-adapter.md +0 -2
- package/docs/opencode-omo-validation-checklist.md +0 -1
- package/docs/spec-contract.md +10 -36
- 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-router-rules.json +2 -2
- package/docs/workflow-router-rules.md +2 -2
- package/docs/workflow-stage-contracts.json +2 -2
- package/docs/workflow-stage-contracts.md +2 -2
- package/docs/ws-goal-contract.md +230 -0
- package/package.json +1 -1
- package/templates/workspace/.aiws/continuation/CONTINUATION_PROTOCOL.md +101 -0
- package/templates/workspace/.aiws/manifest.json +2 -10
- package/templates/workspace/.aiws/tools/ws_change_check.py +11 -4
- package/templates/workspace/.opencode/command/ws-finish.md +4 -0
- package/templates/workspace/.opencode/command/ws-goal.md +44 -0
- package/templates/workspace/.opencode/commands/ws-finish.md +4 -0
- 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-goal/SKILL.md +41 -0
- package/templates/workspace/.opencode/skills/ws-intake/SKILL.md +61 -6
- package/templates/workspace/AGENTS.md +1 -3
- package/templates/workspace/AI_PROJECT.md +6 -1
- package/templates/workspace/AI_WORKSPACE.md +1 -1
- package/templates/workspace/manifest.json +151 -437
- package/templates/workspace/tools/ws_tasks_plan.py +97 -0
- package/templates/workspace/.agents/skills/p-aiws-change-archive/SKILL.md +0 -24
- package/templates/workspace/.agents/skills/p-aiws-change-finish/SKILL.md +0 -24
- package/templates/workspace/.agents/skills/p-aiws-change-list/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/p-aiws-change-new/SKILL.md +0 -26
- package/templates/workspace/.agents/skills/p-aiws-change-next/SKILL.md +0 -19
- package/templates/workspace/.agents/skills/p-aiws-change-start/SKILL.md +0 -33
- package/templates/workspace/.agents/skills/p-aiws-change-status/SKILL.md +0 -19
- package/templates/workspace/.agents/skills/p-aiws-change-sync/SKILL.md +0 -19
- package/templates/workspace/.agents/skills/p-aiws-change-templates-init/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/p-aiws-change-templates-which/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/p-aiws-change-validate/SKILL.md +0 -23
- package/templates/workspace/.agents/skills/p-aiws-hooks-install/SKILL.md +0 -30
- package/templates/workspace/.agents/skills/p-aiws-hooks-status/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/p-aiws-init/SKILL.md +0 -27
- package/templates/workspace/.agents/skills/p-aiws-rollback/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/p-aiws-update/SKILL.md +0 -26
- package/templates/workspace/.agents/skills/p-aiws-validate/SKILL.md +0 -22
- package/templates/workspace/.agents/skills/p-tasks-plan/SKILL.md +0 -37
- package/templates/workspace/.agents/skills/using-aiws/SKILL.md +0 -105
- package/templates/workspace/.agents/skills/ws-analyze/SKILL.md +0 -26
- package/templates/workspace/.agents/skills/ws-bugfix/SKILL.md +0 -111
- package/templates/workspace/.agents/skills/ws-commit/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/ws-delegate/SKILL.md +0 -75
- package/templates/workspace/.agents/skills/ws-deliver/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/ws-dev/SKILL.md +0 -109
- package/templates/workspace/.agents/skills/ws-dev-lite/SKILL.md +0 -58
- package/templates/workspace/.agents/skills/ws-finish/SKILL.md +0 -22
- package/templates/workspace/.agents/skills/ws-frontend-design/SKILL.md +0 -126
- package/templates/workspace/.agents/skills/ws-handoff/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/ws-intake/SKILL.md +0 -87
- package/templates/workspace/.agents/skills/ws-migrate/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/ws-plan/SKILL.md +0 -144
- package/templates/workspace/.agents/skills/ws-plan-verify/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/ws-preflight/SKILL.md +0 -56
- package/templates/workspace/.agents/skills/ws-pull/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/ws-push/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/ws-quality-review/SKILL.md +0 -56
- package/templates/workspace/.agents/skills/ws-req-change/SKILL.md +0 -41
- package/templates/workspace/.agents/skills/ws-req-contract-sync/SKILL.md +0 -17
- package/templates/workspace/.agents/skills/ws-req-contract-validate/SKILL.md +0 -12
- package/templates/workspace/.agents/skills/ws-req-flow-sync/SKILL.md +0 -28
- package/templates/workspace/.agents/skills/ws-req-review/SKILL.md +0 -32
- package/templates/workspace/.agents/skills/ws-review/SKILL.md +0 -55
- package/templates/workspace/.agents/skills/ws-rule/SKILL.md +0 -23
- package/templates/workspace/.agents/skills/ws-spec-review/SKILL.md +0 -57
- package/templates/workspace/.agents/skills/ws-submodule-setup/SKILL.md +0 -18
- package/templates/workspace/.agents/skills/ws-verify-before-complete/SKILL.md +0 -18
- package/templates/workspace/.claude/commands/p-aiws-change-archive.md +0 -24
- package/templates/workspace/.claude/commands/p-aiws-change-finish.md +0 -24
- package/templates/workspace/.claude/commands/p-aiws-change-list.md +0 -23
- package/templates/workspace/.claude/commands/p-aiws-change-new.md +0 -24
- package/templates/workspace/.claude/commands/p-aiws-change-next.md +0 -24
- package/templates/workspace/.claude/commands/p-aiws-change-start.md +0 -24
- package/templates/workspace/.claude/commands/p-aiws-change-status.md +0 -24
- package/templates/workspace/.claude/commands/p-aiws-change-sync.md +0 -24
- package/templates/workspace/.claude/commands/p-aiws-change-templates-init.md +0 -23
- package/templates/workspace/.claude/commands/p-aiws-change-templates-which.md +0 -23
- package/templates/workspace/.claude/commands/p-aiws-change-validate.md +0 -24
- package/templates/workspace/.claude/commands/p-aiws-hooks-install.md +0 -23
- package/templates/workspace/.claude/commands/p-aiws-hooks-status.md +0 -23
- package/templates/workspace/.claude/commands/p-aiws-init.md +0 -20
- package/templates/workspace/.claude/commands/p-aiws-rollback.md +0 -13
- package/templates/workspace/.claude/commands/p-aiws-update.md +0 -19
- package/templates/workspace/.claude/commands/p-aiws-validate.md +0 -14
- package/templates/workspace/.claude/commands/using-aiws.md +0 -25
- package/templates/workspace/.claude/commands/ws-analyze.md +0 -27
- package/templates/workspace/.claude/commands/ws-bugfix.md +0 -32
- package/templates/workspace/.claude/commands/ws-commit.md +0 -67
- package/templates/workspace/.claude/commands/ws-deliver.md +0 -55
- package/templates/workspace/.claude/commands/ws-dev-lite.md +0 -31
- package/templates/workspace/.claude/commands/ws-dev.md +0 -33
- package/templates/workspace/.claude/commands/ws-finish.md +0 -72
- package/templates/workspace/.claude/commands/ws-handoff.md +0 -23
- package/templates/workspace/.claude/commands/ws-intake.md +0 -19
- package/templates/workspace/.claude/commands/ws-migrate.md +0 -22
- package/templates/workspace/.claude/commands/ws-plan-verify.md +0 -25
- package/templates/workspace/.claude/commands/ws-plan.md +0 -21
- package/templates/workspace/.claude/commands/ws-preflight.md +0 -27
- package/templates/workspace/.claude/commands/ws-pull.md +0 -84
- package/templates/workspace/.claude/commands/ws-push.md +0 -90
- package/templates/workspace/.claude/commands/ws-quality-review.md +0 -24
- package/templates/workspace/.claude/commands/ws-req-change.md +0 -42
- package/templates/workspace/.claude/commands/ws-req-contract-sync.md +0 -18
- package/templates/workspace/.claude/commands/ws-req-contract-validate.md +0 -13
- package/templates/workspace/.claude/commands/ws-req-flow-sync.md +0 -20
- package/templates/workspace/.claude/commands/ws-req-review.md +0 -33
- package/templates/workspace/.claude/commands/ws-review.md +0 -31
- package/templates/workspace/.claude/commands/ws-rule.md +0 -24
- package/templates/workspace/.claude/commands/ws-spec-review.md +0 -24
- package/templates/workspace/.claude/commands/ws-submodule-setup.md +0 -54
- package/templates/workspace/.claude/commands/ws-verify-before-complete.md +0 -24
- package/templates/workspace/.claude/settings.json.example +0 -26
- package/templates/workspace/.claude/skills/p-aiws-change-archive/SKILL.md +0 -24
- package/templates/workspace/.claude/skills/p-aiws-change-finish/SKILL.md +0 -24
- package/templates/workspace/.claude/skills/p-aiws-change-list/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/p-aiws-change-new/SKILL.md +0 -26
- package/templates/workspace/.claude/skills/p-aiws-change-next/SKILL.md +0 -19
- package/templates/workspace/.claude/skills/p-aiws-change-start/SKILL.md +0 -33
- package/templates/workspace/.claude/skills/p-aiws-change-status/SKILL.md +0 -19
- package/templates/workspace/.claude/skills/p-aiws-change-sync/SKILL.md +0 -19
- package/templates/workspace/.claude/skills/p-aiws-change-templates-init/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/p-aiws-change-templates-which/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/p-aiws-change-validate/SKILL.md +0 -23
- package/templates/workspace/.claude/skills/p-aiws-hooks-install/SKILL.md +0 -30
- package/templates/workspace/.claude/skills/p-aiws-hooks-status/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/p-aiws-init/SKILL.md +0 -27
- package/templates/workspace/.claude/skills/p-aiws-rollback/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/p-aiws-update/SKILL.md +0 -26
- package/templates/workspace/.claude/skills/p-aiws-validate/SKILL.md +0 -22
- package/templates/workspace/.claude/skills/p-tasks-plan/SKILL.md +0 -37
- package/templates/workspace/.claude/skills/using-aiws/SKILL.md +0 -87
- package/templates/workspace/.claude/skills/ws-analyze/SKILL.md +0 -26
- package/templates/workspace/.claude/skills/ws-bugfix/SKILL.md +0 -111
- package/templates/workspace/.claude/skills/ws-commit/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/ws-deliver/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/ws-dev/SKILL.md +0 -79
- package/templates/workspace/.claude/skills/ws-dev-lite/SKILL.md +0 -58
- package/templates/workspace/.claude/skills/ws-finish/SKILL.md +0 -22
- package/templates/workspace/.claude/skills/ws-frontend-design/SKILL.md +0 -126
- package/templates/workspace/.claude/skills/ws-handoff/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/ws-intake/SKILL.md +0 -31
- package/templates/workspace/.claude/skills/ws-migrate/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/ws-plan/SKILL.md +0 -138
- package/templates/workspace/.claude/skills/ws-plan-verify/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/ws-preflight/SKILL.md +0 -55
- package/templates/workspace/.claude/skills/ws-pull/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/ws-push/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/ws-quality-review/SKILL.md +0 -56
- package/templates/workspace/.claude/skills/ws-req-change/SKILL.md +0 -41
- package/templates/workspace/.claude/skills/ws-req-contract-sync/SKILL.md +0 -17
- package/templates/workspace/.claude/skills/ws-req-contract-validate/SKILL.md +0 -12
- package/templates/workspace/.claude/skills/ws-req-flow-sync/SKILL.md +0 -28
- package/templates/workspace/.claude/skills/ws-req-review/SKILL.md +0 -32
- package/templates/workspace/.claude/skills/ws-review/SKILL.md +0 -55
- package/templates/workspace/.claude/skills/ws-rule/SKILL.md +0 -23
- package/templates/workspace/.claude/skills/ws-spec-review/SKILL.md +0 -57
- package/templates/workspace/.claude/skills/ws-submodule-setup/SKILL.md +0 -18
- package/templates/workspace/.claude/skills/ws-verify-before-complete/SKILL.md +0 -18
- package/templates/workspace/.codex/prompts/aiws-init.md +0 -23
- package/templates/workspace/.codex/prompts/aiws-rollback.md +0 -16
- package/templates/workspace/.codex/prompts/aiws-update.md +0 -22
- package/templates/workspace/.codex/prompts/aiws-validate.md +0 -17
- package/templates/workspace/.codex/prompts/ws-analyze.md +0 -32
- package/templates/workspace/.codex/prompts/ws-dev.md +0 -36
- package/templates/workspace/.codex/prompts/ws-migrate.md +0 -27
- package/templates/workspace/.codex/prompts/ws-preflight.md +0 -32
- package/templates/workspace/.codex/prompts/ws-req-change.md +0 -39
- package/templates/workspace/.codex/prompts/ws-req-contract-sync.md +0 -23
- package/templates/workspace/.codex/prompts/ws-req-contract-validate.md +0 -18
- package/templates/workspace/.codex/prompts/ws-req-flow-sync.md +0 -25
- package/templates/workspace/.codex/prompts/ws-req-review.md +0 -38
- package/templates/workspace/.codex/prompts/ws-review.md +0 -32
- package/templates/workspace/.codex/prompts/ws-rule.md +0 -29
|
@@ -137,11 +137,11 @@
|
|
|
137
137
|
},
|
|
138
138
|
{
|
|
139
139
|
"label": "review",
|
|
140
|
-
|
|
140
|
+
"value": "`changes/<change-id>/review/...` 或 `.aiws/tmp/review/...`"
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
"label": "validate",
|
|
144
|
-
|
|
144
|
+
"value": "`.aiws/tmp/aiws-validate/*.json`"
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
"label": "verify-before-complete",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
最少证据集合:
|
|
49
49
|
|
|
50
50
|
- planning:`plan/...`、`changes/<change-id>/proposal.md`、`tasks.md`
|
|
51
|
-
- review:`changes/<change-id>/review/...` 或 `.
|
|
52
|
-
- validate:`.
|
|
51
|
+
- review:`changes/<change-id>/review/...` 或 `.aiws/tmp/review/...`
|
|
52
|
+
- validate:`.aiws/tmp/aiws-validate/*.json`
|
|
53
53
|
- verify-before-complete:`changes/<change-id>/evidence/verify-before-complete.md`;结构化逐项 gate 结果(spec-review ✓/✗, quality-review ✓/✗, validate ✓/✗, no-Critical ✓/✗, handoff ✓/✗)
|
|
54
54
|
- deliver / finish:`changes/<change-id>/evidence/...`、`state`、merge / push 结果
|
|
55
55
|
- handoff:`changes/archive/.../handoff.md`
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# ws-goal-contract
|
|
2
|
+
|
|
3
|
+
ws-goal 协议层规范:目标定义、完成审计、预算约束与工具适配矩阵。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Background & Motivation
|
|
8
|
+
|
|
9
|
+
### /goal 类指令的五层架构
|
|
10
|
+
|
|
11
|
+
一些工具引入了 `/goal` 类指令。它的实现分五层:
|
|
12
|
+
|
|
13
|
+
| 层 | 实现 | 职责 |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| 持久化层 | Rust `thread_goals` 状态表 | 目标状态 pursuing/paused/achieved/budget_limited,token 用量,耗时 |
|
|
16
|
+
| App-Server API | `thread/goal/get/set/clear` + 通知 | 跨客户端同步,断线重连恢复 |
|
|
17
|
+
| Model Tools | `get_goal` / `create_goal` / `update_goal` | 模型只读 / 受限写入,不能暂停或清除 |
|
|
18
|
+
| Runtime | continuation 调度 + budget 追踪 | 自动续跑、interrupt 暂停、resume 恢复、soft-stop |
|
|
19
|
+
| TUI | `/goal` `/goal pause/resume/clear` | 创建、查看、控制生命周期 |
|
|
20
|
+
|
|
21
|
+
核心运行机制:用户输入 `/goal <objective>` 后,runtime 将目标持久化为 thread-level 状态。每轮结束时注入 `continuation.md` 模板,跟踪已用时间、已消耗 token、总预算、剩余 token。模型通过 `update_goal(complete)` 声明完成,runtime 在预算耗尽时注入 `budget_limit.md` 执行 soft stop(非 abort),整理进度报告而不是直接终止。
|
|
22
|
+
|
|
23
|
+
### aiws 的现状与机会
|
|
24
|
+
|
|
25
|
+
aiws 当前没有等价协议。OpenCode + oh-my-opencode 已经提供了 3 层递进的自执行机制:
|
|
26
|
+
|
|
27
|
+
- **L1 Todo Continuation Enforcer(Boulder 模式)**:session.idle + 未完成 todo 时自动注入 continuation 指令,5s 冷却 + 指数退避,最多 5 次连续失败后退出
|
|
28
|
+
- **L2 Ralph Loop(自引用迭代执行)**:通过 `/ralph-loop <task>` 触发,状态持久化在 `.opencode/ralph-loop.local.md`,持续注入 continuation prompt 直到模型输出 `<promise>DONE</promise>`
|
|
29
|
+
- **L3 Ultrawork(审计闭环)**:模型输出 DONE 后启动独立 Oracle 审查,必须输出 `<promise>VERIFIED</promise>` 才能通过;审查失败回 loop 继续修复
|
|
30
|
+
|
|
31
|
+
这三层机制已经提供了续跑调度和基本持久化,但没有标准的"目标设定"协议,没有预算约束定义,也没有可移植的完成审计规范。
|
|
32
|
+
|
|
33
|
+
### 方案:ws-goal 作为协议层
|
|
34
|
+
|
|
35
|
+
ws-goal 定义为**协议层**(prompt-template + artifact spec),不是运行时引擎。它负责任务目标的结构化定义、完成审计的证据规范、预算耗尽协议。续跑调度继续借用各平台已有的能力。
|
|
36
|
+
|
|
37
|
+
这样做的好处是:不重复造 runtime,不绑定特定工具,只写一份规范就能投影到所有平台。
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 2. Core Concepts
|
|
42
|
+
|
|
43
|
+
### 2.1 Goal Objective Contract
|
|
44
|
+
|
|
45
|
+
每个 goal objective 必须包含以下 6 个元素:
|
|
46
|
+
|
|
47
|
+
| 字段 | 类型 | 说明 |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| **outcome** | string | 具体的可交付物描述。必须是可验证的,不能是模糊意图 |
|
|
50
|
+
| **verification** | string | 如何证明完成。可以是文件路径 + 校验、测试命令 + 预期输出、benchmark 阈值、artifact URL |
|
|
51
|
+
| **constraints** | object | 预算限制:token_budget(token 上限)、time_budget(wall clock 上限)、max_iterations(turn 次数上限) |
|
|
52
|
+
| **boundaries** | string[] | 显式的非目标、范围限制。什么不在本次 goal 内 |
|
|
53
|
+
| **iteration_policy** | object | max_attempts(重试次数)、reaudit_frequency(每几次迭代重新审计一次) |
|
|
54
|
+
| **blocked_stop** | boolean | 遇到 blocker 时是否暂停并报告。true = 报告并等待,不能静默失败 |
|
|
55
|
+
|
|
56
|
+
### 2.2 Goal State Machine
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
active → paused (optional) → complete | budget_limited → archived
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- **active**:目标正在执行中。可能有多个 iteration
|
|
63
|
+
- **paused**(可选):目标被暂停。运行时能力取决于平台。
|
|
64
|
+
- **complete**:完成审计通过,目标已被证明达成
|
|
65
|
+
- **budget_limited**:预算耗尽,目标未完成但无法继续。产生进度报告和 TODO 列表供继续
|
|
66
|
+
- **archived**:最终状态。goal artifact 归档到 evidence 目录
|
|
67
|
+
|
|
68
|
+
### 2.3 Completion Audit Protocol
|
|
69
|
+
|
|
70
|
+
8 步完成审计方法:
|
|
71
|
+
|
|
72
|
+
1. **Derive requirements**:从 objective 推导出具体的、可验证的需求列表。不是重复 objective 原文,而是分解为可逐个检查的原子项
|
|
73
|
+
2. **Preserve scope**:保持原始目标范围。不要将"已经做了什么"重新定义为目标——audit 评判的是原始目标是否达成
|
|
74
|
+
3. **Identify evidence sources**:对每个需求,指定权威证据来源(文件内容、测试命令、benchmark 数据、artifact)
|
|
75
|
+
4. **Inspect current state**:检查当前状态中与每个需求相关的证据源
|
|
76
|
+
5. **Classify evidence**:对每个证据分类——proves completion(证明完成)/ contradicts(矛盾,证明未完成)/ incomplete(部分完成但不足)/ too weak(证据太弱,不能作为完成依据)/ missing(缺失,没有找到对应证据)
|
|
77
|
+
6. **Match scope**:验证范围必须匹配需求范围。窄验证不能推导出宽结论。例如"一个函数返回 200"不能证明"整个 API 端点正常工作"
|
|
78
|
+
7. **Uncertain = NOT achieved**:不确定的、间接的、推论性的证据不能作为完成依据。audit 需要确定的证明
|
|
79
|
+
8. **Prove, not disprove**:audit 必须正面证明完成,而不是反面证明"没找到未完成的工作"。找不出 bug 不等于代码正确
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 3. Protocol Specification
|
|
84
|
+
|
|
85
|
+
### 3.1 Goal Objective Markdown Template
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
---
|
|
89
|
+
ws_goal:
|
|
90
|
+
version: 1
|
|
91
|
+
state: active # active | paused | complete | budget_limited | archived
|
|
92
|
+
created_at: <ISO 8601>
|
|
93
|
+
updated_at: <ISO 8601>
|
|
94
|
+
iteration: 1
|
|
95
|
+
max_iterations: <number>
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
# Goal: <简短标题>
|
|
99
|
+
|
|
100
|
+
## Outcome
|
|
101
|
+
|
|
102
|
+
<具体的可交付物描述。必须可验证>
|
|
103
|
+
|
|
104
|
+
## Verification
|
|
105
|
+
|
|
106
|
+
- **Type**: file | test | command | benchmark | artifact
|
|
107
|
+
- **Target**: <文件路径 / 测试命令 / benchmark ID 等>
|
|
108
|
+
- **Expected**: <预期结果>
|
|
109
|
+
|
|
110
|
+
## Constraints
|
|
111
|
+
|
|
112
|
+
- token_budget: <number> | null
|
|
113
|
+
- time_budget: <minutes> | null
|
|
114
|
+
- max_iterations: <number>
|
|
115
|
+
|
|
116
|
+
## Boundaries
|
|
117
|
+
|
|
118
|
+
- <不做什么 1>
|
|
119
|
+
- <不做什么 2>
|
|
120
|
+
|
|
121
|
+
## Iteration Policy
|
|
122
|
+
|
|
123
|
+
- max_attempts: <number>
|
|
124
|
+
- reaudit_frequency: <number> # 每 N 次 iteration 重新做一次完成审计
|
|
125
|
+
|
|
126
|
+
## Blocked Stop
|
|
127
|
+
|
|
128
|
+
- enabled: true | false
|
|
129
|
+
- report_to: user | log
|
|
130
|
+
|
|
131
|
+
## Progress Notes
|
|
132
|
+
|
|
133
|
+
<每次迭代更新,记录做了什么、什么阻塞、进度百分比>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 3.2 Evidence Type Registry
|
|
137
|
+
|
|
138
|
+
完成审计使用的证据类型:
|
|
139
|
+
|
|
140
|
+
| Type | Schema | 说明 |
|
|
141
|
+
|---|---|---|
|
|
142
|
+
| **file** | `{ path: string, checksum?: string }` | 文件存在且内容匹配。checksum 可选,用于精确内容验证 |
|
|
143
|
+
| **test** | `{ command: string, expected_exit: number, expected_output?: string }` | 运行测试命令,检查退出码和输出 |
|
|
144
|
+
| **command** | `{ command: string, stdout?: string, stderr?: string, exit_code: number }` | 运行任意命令,捕获标准输出、错误输出、退出码 |
|
|
145
|
+
| **benchmark** | `{ metric: string, before: number, after: number, threshold: string }` | 性能基准。threshold 格式 `"<N"` `">N"` `"±N%"` |
|
|
146
|
+
| **artifact** | `{ url: string, metadata?: object }` | 外部交付物(部署 URL、PR 链接、发布包等)。metadata 可包含版本号、commit sha 等 |
|
|
147
|
+
|
|
148
|
+
### 3.3 Budget Protocol
|
|
149
|
+
|
|
150
|
+
三个约束维度,全部为软停止(soft-stop,不 abort):
|
|
151
|
+
|
|
152
|
+
| 维度 | 类型 | 默认 | 软停止行为 |
|
|
153
|
+
|---|---|---|---|
|
|
154
|
+
| **token_budget** | number | null(无限制) | 接近上限时注入 budget 警告,到达上限时记录进度报告并暂停。**不**中断模型输出 |
|
|
155
|
+
| **time_budget** | number (minutes) | null(无限制) | 到达时限时发出超时信号,运行中的 tool 调用完成后自然停止,不走 kill |
|
|
156
|
+
| **max_iterations** | number | null(无限制) | 达到上限后阻止下次续跑,产出进度摘要和剩余 TODO |
|
|
157
|
+
|
|
158
|
+
token_budget 依赖平台的 token 计数器。aiws 不提供独立的 token 监控,只定义协议:平台应能声明当前 token 用量和剩余预算。当平台无法提供 token 计数时,此维度应标记为 `unsupported`。
|
|
159
|
+
|
|
160
|
+
### 3.4 Integration with Existing aiws Artifacts
|
|
161
|
+
|
|
162
|
+
| aiws 工件 | ws-goal 映射 |
|
|
163
|
+
|---|---|
|
|
164
|
+
| `changes/<id>/tasks.md` | tasks.md 中的每个 item 可携带 `ws_goal_id: <id>` 引用,表示该 task 通过 goal 自动执行。`update_plan` 的 progress tracking 反映 goal iteration 进度 |
|
|
165
|
+
| `.aiws/plan/...` proposal | proposal 中的 `Plan_File` 可以指向 goal objective markdown,表示该 change 使用 goal-driven 执行模式 |
|
|
166
|
+
| `aiws validate` + evidence | validate 的门禁检查可以包含对 goal 的完成审计证据的校验。goal 的 evidence 应落盘到 `changes/<id>/evidence/`,与其他 change 工件统一 |
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 4. Tool Integration Matrix
|
|
171
|
+
|
|
172
|
+
| Tool | Continuation Engine | Goal Persistence | Budget Tracking | Audit Method |
|
|
173
|
+
|---|---|---|---|---|
|
|
174
|
+
| **OpenCode** | Ralph Loop L2(`/ralph-loop` 自引循环) / Ultrawork L3(Ralph Loop + Oracle 审计) | `.opencode/ralph-loop.local.md`(YAML frontmatter,active/iteration 状态) | max_iterations 硬限制(L2),无 token/time budget | L2: `<promise>DONE</promise>` 语义声明;L3: Oracle 独立审计 + `<promise>VERIFIED</promise>` |
|
|
175
|
+
| **aiws ws-goal protocol** | 不提供。依赖各平台已有 continuation 引擎 | `.aiws/goals/<goal-id>.md`(标准模板工件)+ `changes/<id>/evidence/` 审计证据 | 定义协议但依赖平台能力 | 8 步完成审计(协议层规范,平台层执行) |
|
|
176
|
+
|
|
177
|
+
### 关键说明
|
|
178
|
+
|
|
179
|
+
- **OpenCode L2 vs L3**:L2 只有自检声明(DONE),可信度较低;L3 引入独立审计者(Oracle),可信度较高但成本也高。ws-goal 协议推荐的审计模式是 L3,但允许 L2 作为轻度使用的降级
|
|
180
|
+
- ws-goal 协议可以投影到各平台时绑定其 continuation 能力,只需补充完成审计的规范约束
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 5. Protocol Limitations
|
|
185
|
+
|
|
186
|
+
### 5.1 NOT a Runtime
|
|
187
|
+
|
|
188
|
+
ws-goal 协议层不实现任何 continuation/scheduling/pause/resume 机制。这些能力完全依赖于各平台:
|
|
189
|
+
|
|
190
|
+
- OpenCode:依赖 Ralph Loop(文件状态轮询 + prompt 注入)
|
|
191
|
+
|
|
192
|
+
这意味着跨工具的"暂停/恢复"行为会不一致。
|
|
193
|
+
|
|
194
|
+
### 5.2 Budget Tracking 依赖平台能力
|
|
195
|
+
|
|
196
|
+
token_budget 和 time_budget 的监控需要平台提供接口。当前:
|
|
197
|
+
|
|
198
|
+
- OpenCode(oh-my-opencode):无 token 计数,只有 max_iterations
|
|
199
|
+
|
|
200
|
+
aiws 只定义"预算耗尽时应该做什么"的协议,不提供跨平台的统一计费层。在缺少平台支持的维度上,goal 应标记为 unsupported 而不是假装能工作。
|
|
201
|
+
|
|
202
|
+
### 5.3 Cross-Tool Goal Persistence 是 Best-Effort
|
|
203
|
+
|
|
204
|
+
不同工具使用不同的持久化机制:
|
|
205
|
+
|
|
206
|
+
- OpenCode(Ralph Loop):文件 `.opencode/ralph-loop.local.md`(会话级)
|
|
207
|
+
|
|
208
|
+
没有共享数据库。如果一个目标在一个工具开始,无法在另一个工具中恢复。goal objective markdown 文件 `.aiws/goals/<goal-id>.md` 可以作为人类可读的参考,但状态同步不保证。
|
|
209
|
+
|
|
210
|
+
### 5.4 State Machine 的工具依赖
|
|
211
|
+
|
|
212
|
+
完整状态机 `active → paused → complete | budget_limited → archived` 中各状态的支持情况:
|
|
213
|
+
|
|
214
|
+
| 状态转换 | OpenCode (Ralph Loop) |
|
|
215
|
+
|---|---|---|
|
|
216
|
+
| active → paused | 不支持(只能 cancel) |
|
|
217
|
+
| paused → active | 不支持 |
|
|
218
|
+
| active → complete | 支持(DONE 声明 + oracle 验证) |
|
|
219
|
+
| active → budget_limited | 不支持 |
|
|
220
|
+
| complete → archived | 手动 |
|
|
221
|
+
|
|
222
|
+
aiws 协议层定义了完整的语义状态,但各平台只能实现其中一部分。goal 创建时应注意平台的能力边界。
|
|
223
|
+
|
|
224
|
+
### 5.5 Completion Audit 的执行成本
|
|
225
|
+
|
|
226
|
+
8 步完成审计方法在完整执行时需要独立审计者(在 OpenCode L3 中需要额外模型调用)。对于小目标(比如"修复一个 lint 错误"),完整审计的 overhead 可能超过实际工作的成本。建议根据目标复杂度选择审计级别:
|
|
227
|
+
|
|
228
|
+
- **轻量**(< 3 步,单文件改动):只做 step 1-2(derive + preserve),跳过完整证据链
|
|
229
|
+
- **标准**(3-10 步,多文件改动):完整 8 步审计
|
|
230
|
+
- **严格**(跨模块、跨 repo):8 步审计 + 独立审计者 + ws-review 门禁
|
package/package.json
CHANGED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# ws-* Pipeline Continuation Protocol
|
|
2
|
+
|
|
3
|
+
## 问题
|
|
4
|
+
|
|
5
|
+
每个 ws-* skill 完成当前 phase 后输出 `Next:` 文本建议,然后停下。用户需要手动输入下一 phase 的 slash 命令。本协议定义了一套标准化机制,让所有 ws-* skill 在完成后自动推进到下一 phase。
|
|
6
|
+
|
|
7
|
+
## 核心机制
|
|
8
|
+
|
|
9
|
+
### 1. Pipeline 状态文件
|
|
10
|
+
|
|
11
|
+
`.aiws/continuation/pipeline.json` — 共享状态文件,记录当前流水线所有 phase 的状态。
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"pipeline_id": "<pipeline-id>",
|
|
16
|
+
"goal_id": "<goal-id>",
|
|
17
|
+
"change_id": "<change-id>",
|
|
18
|
+
"created_at": "<UTC timestamp>",
|
|
19
|
+
"updated_at": "<UTC timestamp>",
|
|
20
|
+
"phases": [
|
|
21
|
+
{"name": "preflight", "status": "completed", "evidence": ""},
|
|
22
|
+
{"name": "ws-goal", "status": "completed", "evidence": ".aiws/goals/<goal-id>.md"},
|
|
23
|
+
{"name": "ws-plan", "status": "in_progress", "evidence": ""},
|
|
24
|
+
{"name": "ws-plan-verify","status": "pending", "evidence": ""},
|
|
25
|
+
{"name": "ws-dev", "status": "pending", "evidence": ""},
|
|
26
|
+
{"name": "ws-review", "status": "pending", "evidence": ""},
|
|
27
|
+
{"name": "ws-commit", "status": "pending", "evidence": ""},
|
|
28
|
+
{"name": "ws-finish", "status": "pending", "evidence": ""}
|
|
29
|
+
],
|
|
30
|
+
"current_phase_index": 2,
|
|
31
|
+
"blockers": []
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
状态值: `pending` | `in_progress` | `completed` | `blocked`
|
|
36
|
+
|
|
37
|
+
### 2. Phase Completion Protocol(所有 ws-* skill 共享)
|
|
38
|
+
|
|
39
|
+
每个 ws-* skill 完成后执行(替代原有 `Next:` 输出 + 结束):
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
1. 更新 pipeline.json:
|
|
43
|
+
- 当前 phase → status: "completed", evidence: <路径>
|
|
44
|
+
- 下一 phase → status: "in_progress"
|
|
45
|
+
- current_phase_index → 下一 phase 索引号
|
|
46
|
+
- updated_at → 当前时间
|
|
47
|
+
|
|
48
|
+
2. 更新 todo:
|
|
49
|
+
- 当前 phase 的 todo → completed
|
|
50
|
+
- 下一 phase 的 todo → in_progress(若还不存在则创建)
|
|
51
|
+
|
|
52
|
+
3. 若还有下一 phase:
|
|
53
|
+
- 输出 "→ Auto-continuing to <next_phase>"
|
|
54
|
+
- 立即开始执行下一 phase 的逻辑(不输出"是否继续"等待文本)
|
|
55
|
+
|
|
56
|
+
4. 若已是最后一个 phase:
|
|
57
|
+
- 输出 pipeline 完成摘要
|
|
58
|
+
- 标记 goal 为 complete
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 3. Continuation Detection(所有 ws-* skill 共享)
|
|
62
|
+
|
|
63
|
+
当 skill 被调用时(包括 slash command 直接调用 和 Boulder/Ralph Loop continuation):
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
检查 .aiws/continuation/pipeline.json:
|
|
67
|
+
- 若存在且有 in_progress phase:
|
|
68
|
+
a) 如果 in_progress phase 名称 == 当前 skill 名称 → 正常执行当前 skill
|
|
69
|
+
b) 如果 in_progress phase 名称 ≠ 当前 skill 名称 → 跳到该 phase 的执行逻辑
|
|
70
|
+
c) 如果所有 phase completed → 输出 pipeline 完成摘要,不再执行新工作
|
|
71
|
+
- 若不存在 → 正常执行当前 skill(独立模式)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 4. Skill Entry 改造
|
|
75
|
+
|
|
76
|
+
每个 ws-* SKILL.md 顶部增加 Pipeline Continuation Detection 段。
|
|
77
|
+
|
|
78
|
+
### 5. Skill Ending 改造
|
|
79
|
+
|
|
80
|
+
每个 ws-* SKILL.md 的 `输出要求` / `Next:` 段替换为 Phase Completion Protocol。
|
|
81
|
+
|
|
82
|
+
### 6. ws-goal 作为 Pipeline 启动器
|
|
83
|
+
|
|
84
|
+
ws-goal 在复杂度评估后:
|
|
85
|
+
- 创建 pipeline.json(预填所有 phase)
|
|
86
|
+
- 创建所有 phase 对应的 todo
|
|
87
|
+
- 直接执行第一个 phase 的逻辑(不停下)
|
|
88
|
+
|
|
89
|
+
## 默认 Pipeline 链路
|
|
90
|
+
|
|
91
|
+
preflight → ws-goal → ws-plan → ws-plan-verify → ws-dev → ws-review → ws-commit → ws-finish
|
|
92
|
+
|
|
93
|
+
根据复杂度评估选择包含哪些 phase:
|
|
94
|
+
- 简单路径: ws-goal → dev → commit → finish
|
|
95
|
+
- 标准路径: ws-goal → plan → plan-verify → dev → review → commit → finish
|
|
96
|
+
- 复杂路径: 标准路径 + intake + deliver + handoff
|
|
97
|
+
|
|
98
|
+
## 文件位置
|
|
99
|
+
|
|
100
|
+
- 状态文件: `.aiws/continuation/pipeline.json`
|
|
101
|
+
- 协议文档: `.aiws/continuation/CONTINUATION_PROTOCOL.md`
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"aiws_version": "0.0.0",
|
|
6
6
|
"installed_at": "1970-01-01T00:00:00Z",
|
|
7
7
|
"updated_at": "1970-01-01T00:00:00Z",
|
|
8
|
-
"tools": ["
|
|
8
|
+
"tools": ["opencode"],
|
|
9
9
|
"managed": [
|
|
10
10
|
{ "path": ".githooks/pre-commit", "mode": "replace_file", "sha256": "<sha256>" },
|
|
11
11
|
{ "path": ".githooks/pre-push", "mode": "replace_file", "sha256": "<sha256>" },
|
|
@@ -16,17 +16,9 @@
|
|
|
16
16
|
{ "path": "AI_WORKSPACE.md", "mode": "managed_blocks", "blocks": { "ai-workspace:core": "<sha256>" } },
|
|
17
17
|
{ "path": "REQUIREMENTS.md", "mode": "managed_blocks", "blocks": { "requirements:contract": "<sha256>" } },
|
|
18
18
|
{ "path": ".gitignore", "mode": "managed_blocks", "blocks": { "gitignore": "<sha256>" } },
|
|
19
|
-
{ "path": ".claude/commands/aiws-init.md", "mode": "managed_blocks", "blocks": { "claude:aiws-init": "<sha256>" } },
|
|
20
|
-
{ "path": ".claude/commands/aiws-update.md", "mode": "managed_blocks", "blocks": { "claude:aiws-update": "<sha256>" } },
|
|
21
|
-
{ "path": ".claude/commands/aiws-validate.md", "mode": "managed_blocks", "blocks": { "claude:aiws-validate": "<sha256>" } },
|
|
22
|
-
{ "path": ".claude/commands/aiws-rollback.md", "mode": "managed_blocks", "blocks": { "claude:aiws-rollback": "<sha256>" } },
|
|
23
19
|
{ "path": ".opencode/command/aiws-init.md", "mode": "managed_blocks", "blocks": { "opencode:aiws-init": "<sha256>" } },
|
|
24
20
|
{ "path": ".opencode/command/aiws-update.md", "mode": "managed_blocks", "blocks": { "opencode:aiws-update": "<sha256>" } },
|
|
25
21
|
{ "path": ".opencode/command/aiws-validate.md", "mode": "managed_blocks", "blocks": { "opencode:aiws-validate": "<sha256>" } },
|
|
26
|
-
{ "path": ".opencode/command/aiws-rollback.md", "mode": "managed_blocks", "blocks": { "opencode:aiws-rollback": "<sha256>" } }
|
|
27
|
-
{ "path": ".codex/prompts/aiws-init.md", "mode": "managed_blocks", "blocks": { "codex:aiws-init": "<sha256>" } },
|
|
28
|
-
{ "path": ".codex/prompts/aiws-update.md", "mode": "managed_blocks", "blocks": { "codex:aiws-update": "<sha256>" } },
|
|
29
|
-
{ "path": ".codex/prompts/aiws-validate.md", "mode": "managed_blocks", "blocks": { "codex:aiws-validate": "<sha256>" } },
|
|
30
|
-
{ "path": ".codex/prompts/aiws-rollback.md", "mode": "managed_blocks", "blocks": { "codex:aiws-rollback": "<sha256>" } }
|
|
22
|
+
{ "path": ".opencode/command/aiws-rollback.md", "mode": "managed_blocks", "blocks": { "opencode:aiws-rollback": "<sha256>" } }
|
|
31
23
|
]
|
|
32
24
|
}
|
|
@@ -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)
|
|
@@ -66,6 +66,10 @@ fi
|
|
|
66
66
|
7) submodules 全部成功后,再回到主仓库执行:
|
|
67
67
|
- `aiws change finish <change-id> --push`
|
|
68
68
|
8) `aiws change finish --push` 成功后会自动归档并生成 handoff;只有历史/异常场景才需要手工运行 `aiws change archive <change-id>`。
|
|
69
|
+
9) 输出本轮 change 的中文工作摘要,包含:
|
|
70
|
+
- 目标:解决了什么问题
|
|
71
|
+
- 改动范围:改了哪些文件/模块(可引用 handoff 或 evidence)
|
|
72
|
+
- 验证结果:构建/测试/LSP/validate 等关键门禁的结果
|
|
69
73
|
|
|
70
74
|
安全:
|
|
71
75
|
- push 前先输出状态并说明远端/分支。
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
9) **Auto-chain to next goal**:当前 goal pipeline 完成后:
|
|
38
|
+
a) 扫描 `.aiws/goals/*.md`,按文件名排序找出第一个 status=pending 的 goal
|
|
39
|
+
b) 若找到:读取其 objective,输出 "→ Auto-continuing to <goal-id>",回到步骤 5 创建新 pipeline 自动继续
|
|
40
|
+
c) 若未找到:输出 "All goals completed" 并结束
|
|
41
|
+
d) 若找到的 pending goal 缺少 Success Criteria:输出 blocker 并停止(不自动跳过)
|
|
42
|
+
<!-- AIWS_MANAGED_END:opencode:ws-goal -->
|
|
43
|
+
|
|
44
|
+
可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
|
|
@@ -66,6 +66,10 @@ fi
|
|
|
66
66
|
7) submodules 全部成功后,再回到主仓库执行:
|
|
67
67
|
- `aiws change finish <change-id> --push`
|
|
68
68
|
8) `aiws change finish --push` 成功后会自动归档并生成 handoff;只有历史/异常场景才需要手工运行 `aiws change archive <change-id>`。
|
|
69
|
+
9) 输出本轮 change 的中文工作摘要,包含:
|
|
70
|
+
- 目标:解决了什么问题
|
|
71
|
+
- 改动范围:改了哪些文件/模块(可引用 handoff 或 evidence)
|
|
72
|
+
- 验证结果:构建/测试/LSP/validate 等关键门禁的结果
|
|
69
73
|
|
|
70
74
|
安全:
|
|
71
75
|
- push 前先输出状态并说明远端/分支。
|
|
@@ -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
|
],
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ws-goal
|
|
3
|
+
description: 目标协议:设定可审计的 goal 目标并执行完成闭环(基于 ws-goal-contract.md)
|
|
4
|
+
---
|
|
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
|
+
9) **Auto-chain to next goal**:当前 goal pipeline 完成后:
|
|
38
|
+
a) 扫描 `.aiws/goals/*.md`,按文件名排序找出第一个 status=pending 的 goal
|
|
39
|
+
b) 若找到:读取其 objective,输出 "→ Auto-continuing to <goal-id>",回到步骤 5 创建新 pipeline 自动继续
|
|
40
|
+
c) 若未找到:输出 "All goals completed" 并结束
|
|
41
|
+
d) 若找到的 pending goal 缺少 Success Criteria:输出 blocker 并停止(不自动跳过)
|