@istuen/openxenon 0.1.7
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/LICENSE +21 -0
- package/README.md +231 -0
- package/dist/SKILL-5pahrma4.md +199 -0
- package/dist/SKILL-hrggx7hc.md +423 -0
- package/dist/SKILL-jpk4r1n0.md +366 -0
- package/dist/cli.js +76362 -0
- package/package.json +82 -0
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oxn-work
|
|
3
|
+
description: 发起 + 驱动 OpenXenon Work v1.1(创建 work.oxn + tasks/<name>/task.oxn,注入 domain;含 v1.1 8 阶段流程:init→migrate→create→add-task→validate→lock→run→submit/status,强制 lock 边界守卫 .work.planLock)
|
|
4
|
+
---
|
|
5
|
+
# /oxn-work — 发起 + 驱动 OpenXenon Work v1.1
|
|
6
|
+
|
|
7
|
+
## 目标
|
|
8
|
+
|
|
9
|
+
依据 Blueprint 创建一个 **Work + 至少一个 Task** 的工作区,并在 v1.1 hard-switch 之后强制走 8 阶段流程:
|
|
10
|
+
- `work.oxn` — workspace 编排器(声明 ref 池 + task DAG)
|
|
11
|
+
- `tasks/<name>/task.oxn` — 单 blueprint 执行 + 显式 align
|
|
12
|
+
|
|
13
|
+
v1.1 hard-switch 之后,原 `oxn-leader` 已并入 `oxn work`,无独立 leader skill。
|
|
14
|
+
|
|
15
|
+
> **v1.1 升级要点**:所有 work 操作必须先 `work validate` 写 `.work` 静态门禁卡,再 `work lock` 锁住,然后才能 `work run`。Lock 后任何 `.oxn` 资产漂移 = `IAP_ALIGN_LOCK_HASH_MISMATCH`。
|
|
16
|
+
|
|
17
|
+
## 前置条件
|
|
18
|
+
|
|
19
|
+
- 已在 OXN 项目根目录
|
|
20
|
+
- 项目已 `oxn init` 初始化(存在 `.openxenon/` 边界)
|
|
21
|
+
- 必须有 Blueprint(位于 `.openxenon/blueprints/<name>.oxn`),用 `oxn blueprint create` 创建
|
|
22
|
+
- **可选**:有 DDD Domain(位于 `.openxenon/domains/<kebab>.oxn`),用 `oxn domain create` 创建
|
|
23
|
+
|
|
24
|
+
## Intent-Align 范式提醒
|
|
25
|
+
|
|
26
|
+
- **Domain** = 业务 Intent(term/ban/invariant)
|
|
27
|
+
- **Blueprint** = 技术 Intent(slot 拓扑)
|
|
28
|
+
- **Work** = Align 编排器(声明 ref 池)
|
|
29
|
+
- **Task** = Align 执行单元(align 1 blueprint + N domains)
|
|
30
|
+
- **Part / Probe** = **不是独立资产**,**内联**在 `task { part { probe {} } }` 块里
|
|
31
|
+
|
|
32
|
+
## v1.1 8 阶段流程图
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
init → migrate → create → add-task → validate → lock → run → submit / status
|
|
36
|
+
│ │
|
|
37
|
+
▼ ▼
|
|
38
|
+
.work .work.planLock
|
|
39
|
+
静态门禁卡 4 组件 hash
|
|
40
|
+
(workOxn/workDomains/
|
|
41
|
+
blueprints/tasks +
|
|
42
|
+
allHash)
|
|
43
|
+
锁后任何漂移 →
|
|
44
|
+
IAP_ALIGN_LOCK_HASH_MISMATCH
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**8 阶段详解**:
|
|
48
|
+
- **0**: `oxn work migrate`(V0→V1 布局迁移,PR-10;新建 work 可跳过)
|
|
49
|
+
- **1**: `oxn work create`(建 work 骨架)
|
|
50
|
+
- **2**: `oxn work add-task`(建至少 1 个 task.oxn)
|
|
51
|
+
- **3**: `oxn work validate`(校验 work.oxn + 写 `.work`)
|
|
52
|
+
- **4**: `oxn work lock`(锁住:写 planLock + 4 组件 hash)
|
|
53
|
+
- **5**: `oxn work run`(启动状态机;要求 lock 完成)
|
|
54
|
+
- **6**: `oxn work submit`(推进 task 内 part)
|
|
55
|
+
- **7**: `oxn work status`(查询 work 状态)
|
|
56
|
+
|
|
57
|
+
## 创建 Work + Task(v1.1 8 步)
|
|
58
|
+
|
|
59
|
+
### 步骤 0(V0→V1 迁移,可选):`oxn work migrate`
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
oxn work migrate <work-name>
|
|
63
|
+
# 把 V0 布局 works/<w>/work-state.json 等迁移到 V1 布局 .run/
|
|
64
|
+
# 原 V0 文件备份到 .migrated-v0/(不删,留审计)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 步骤 1:创建 Domain(可选)
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
oxn domain create MemberContext
|
|
71
|
+
oxn domain validate MemberContext
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 步骤 2:创建 Work 编排
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
oxn work create <work-name> --blueprint <bp>
|
|
78
|
+
# 编辑 .openxenon/works/<work>/work.oxn
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
或手写:
|
|
82
|
+
|
|
83
|
+
```oxn
|
|
84
|
+
work "MyFeature" {
|
|
85
|
+
context { goal = "..."; constraints = []; loop_policy { max_iterations = 3 } }
|
|
86
|
+
domain "MemberContext" ref "@prj/domains/MemberContext";
|
|
87
|
+
blueprint "dev-workflow" ref "@prj/blueprints/dev-workflow";
|
|
88
|
+
task "step1" {
|
|
89
|
+
domain "MemberContext";
|
|
90
|
+
blueprint "dev-workflow";
|
|
91
|
+
part "build" { skill_context = "..." }
|
|
92
|
+
deps = [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 步骤 3:创建至少一个 Task
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
oxn work add-task \
|
|
101
|
+
--work <work-name> \
|
|
102
|
+
--task-name <task-name> \
|
|
103
|
+
--blueprint <blueprint-name> \
|
|
104
|
+
[--domain <DomainName>]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 步骤 4:编辑 task 内容(手写 `task.oxn`)
|
|
108
|
+
|
|
109
|
+
### 步骤 5:`work validate`
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
oxn work validate <work-name> --json
|
|
113
|
+
# 校验 work.oxn + 写 .work 静态门禁卡(assets 快照:域/蓝图 fileHash)
|
|
114
|
+
# planLock 此时为 null(未锁)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 步骤 6:`work lock`
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
oxn work lock <work-name> --json
|
|
121
|
+
# 计算 4 组件 hash:
|
|
122
|
+
# workOxnHash = SHA-256(work.oxn)
|
|
123
|
+
# workDomainsHash = SHA-256(concatenated domain.oxn files)
|
|
124
|
+
# blueprintsHash = SHA-256(concatenated blueprint.oxn files)
|
|
125
|
+
# tasksHash = SHA-256(concatenated task.oxn files)
|
|
126
|
+
# 写入 .work.planLock + allHash
|
|
127
|
+
# 锁后任何 .oxn 资产漂移 = IAP_ALIGN_LOCK_HASH_MISMATCH
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`oxn work unlock`(解锁,清 planLock 保留 assets)
|
|
131
|
+
|
|
132
|
+
### 步骤 7:驱动状态机
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
oxn work run --work-file <work>/work.oxn --json
|
|
136
|
+
oxn work submit --work <w> --task <t> --json
|
|
137
|
+
oxn work status --work <w> --json
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 参考命令
|
|
141
|
+
|
|
142
|
+
| 想做什么 | 命令 |
|
|
143
|
+
|---|---|
|
|
144
|
+
| 初始化项目边界 | `oxn init` |
|
|
145
|
+
| 创建一个 Blueprint 骨架 | `oxn blueprint create <name> [--slots <list>]` |
|
|
146
|
+
| 创建一个 Domain 骨架 | `oxn domain create <Name>` |
|
|
147
|
+
| 验证 Blueprint / Domain | `oxn {blueprint,domain} validate <name>` |
|
|
148
|
+
| 列出所有 Domain | `oxn domain list` |
|
|
149
|
+
| **v1.1 V0→V1 布局迁移** | `oxn work migrate <w>` |
|
|
150
|
+
| 创建 work 骨架(含 task 块) | `oxn work create <w> --blueprint <bp>` |
|
|
151
|
+
| 列出 work 下所有 task | `oxn work list-tasks --work <w>` |
|
|
152
|
+
| 查看 task 状态 | `oxn work task-status --work <w> --task <t>` |
|
|
153
|
+
| 获取 AI 上下文(**全量隔离**) | `oxn work context --work <w> --task <t>` |
|
|
154
|
+
| **v1.1 校验 work.oxn + 写 .work** | `oxn work validate <w>` |
|
|
155
|
+
| **v1.1 锁 work(planLock + 4 组件 hash)** | `oxn work lock <w>` |
|
|
156
|
+
| **v1.1 解锁 work** | `oxn work unlock <w>` |
|
|
157
|
+
| 启动 work 状态机 | `oxn work run --work-file <work.oxn>` |
|
|
158
|
+
| 推进 task 内 part | `oxn work submit --work <w> --task <t>` |
|
|
159
|
+
| 查询 work 状态 | `oxn work status --work <w>` |
|
|
160
|
+
|
|
161
|
+
## V0→V1 路径映射
|
|
162
|
+
|
|
163
|
+
v1.1 把 work 运行时状态从 work.oxn 同级目录搬到 `.run/` 子目录,方便 lock 守卫写静态卡:
|
|
164
|
+
|
|
165
|
+
| V0 路径 | V1 路径 |
|
|
166
|
+
|---|---|
|
|
167
|
+
| `works/<w>/work-state.json` | `works/<w>/.run/state.json` |
|
|
168
|
+
| `works/<w>/work-trace.jsonl` | `works/<w>/.run/trace.jsonl` |
|
|
169
|
+
| `works/<w>/work-frozen.json` | `works/<w>/.run/frozen.json` |
|
|
170
|
+
| `works/<w>/tasks/<t>/task-state.json` | `works/<w>/tasks/<t>/state.json` |
|
|
171
|
+
| `works/<w>/tasks/<t>/task-trace.jsonl` | `works/<w>/tasks/<t>/trace.jsonl` |
|
|
172
|
+
| `works/<w>/tasks/<t>/task-frozen.json` | `works/<w>/tasks/<t>/frozen.json` |
|
|
173
|
+
| (无) | `works/<w>/.work`(静态门禁卡) |
|
|
174
|
+
| (无) | `works/<w>/.migrated-v0/<rel>`(V0 备份) |
|
|
175
|
+
|
|
176
|
+
更紧凑表达(grep 模式):
|
|
177
|
+
- V0: `works/<w>/work-{state,trace,frozen}.{json,jsonl}`
|
|
178
|
+
- V1: `works/<w>/.run/{state,trace,frozen}.{json,jsonl}`
|
|
179
|
+
|
|
180
|
+
迁移工具:`oxn work migrate <w>`(V0 备份到 `.migrated-v0/` 供审计,不删)。
|
|
181
|
+
|
|
182
|
+
## v1.1 错误处理速查
|
|
183
|
+
|
|
184
|
+
| 错误码 | 触发条件 | 行动 |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| `IAP_ALIGN_CHECKLIST_MISSING` | task.part.intent_checklist 必填缺失 | YIELD_TO_HUMAN |
|
|
187
|
+
| `IAP_ALIGN_LOCK_NOT_FOUND` | .work.planLock 缺失/未锁 | YIELD_TO_HUMAN:未调 `oxn work lock` / init 缺失 |
|
|
188
|
+
| `IAP_ALIGN_LOCK_HASH_MISMATCH` | 4 组件 hash 之一漂移(workOxn/workDomains/blueprints/tasks) | YIELD_TO_HUMAN:context.component 字段定位漂移源 |
|
|
189
|
+
| `IAP_ALIGN_WORK_REMOVED` | work.oxn 失踪但 .work 还在(锁后被破坏) | YIELD_TO_HUMAN(区别于 WORK_NOT_FOUND:两个都无) |
|
|
190
|
+
|
|
191
|
+
三剑客守卫次序:先校验 planLock 存在 → 再校验 4 组件 hash → 最后校验 work.oxn 存在。
|
|
192
|
+
|
|
193
|
+
## 反模式
|
|
194
|
+
|
|
195
|
+
- **不要跳过 validate+lock 直接 run** — 触发 `IAP_ALIGN_LOCK_NOT_FOUND`
|
|
196
|
+
- **不要绕过 lock 守卫跑生产** — 无 `--force` 后门
|
|
197
|
+
- **不要在锁后修改 .oxn** — 触发 `IAP_ALIGN_LOCK_HASH_MISMATCH`(planLock 已冻 4 组件 hash)
|
|
198
|
+
- **不要删 .work 文件** — 丢失静态门禁卡 = LOCK_NOT_FOUND
|
|
199
|
+
- **不要先 submit 后 run** — `work run` 是 setup,`submit` 是 advance
|
|
200
|
+
- **不要跳过 task 创建** — `work run` 会 fail-fast 拦截(`OXN_TASK_OXN_MISSING`)
|
|
201
|
+
- **不要在 work.oxn 引用 task.oxn 不存在的 task 名** — `work run` 校验失败
|
|
202
|
+
- **不要把 ref 与 align 混为一谈** — `domain "X" ref "..."` 是 work 级声明,task 内 `domain "X"` 是 align
|
|
203
|
+
- **不要在 task 块外加 `part` 字段** — part 必须嵌套在 task 块内
|
|
204
|
+
- **不要写 `task "X" align "Y.Z"`** — 已废弃,改为 `task "X" { blueprint "Y"; part "Z" }`
|
|
205
|
+
- **不要写 `inject "X"`** — 已废弃,改为 task 内 `domain "X"`
|
|
206
|
+
- **不要在 Domain 用 `noun`/`verb`/`domain_rules`** — 改为 `term`/`ban`/`invariant`
|
|
207
|
+
- **不要在 Blueprint 加 `expectation`/`rule` 块** — 已删除,验证由 Probe 承担
|
|
208
|
+
- **不要写 `work "X" ref "@oxn/blueprints/Y"`** — 已废弃,改为 `blueprint "Y" ref "...";` 声明
|
|
209
|
+
- **不要写 `oxn work new`** — 改用 `oxn work create`
|
|
210
|
+
- **不要试图 `oxn part new` / `oxn probe new`** — Part / Probe **不是独立资产**,在 task 块内联写
|
|
211
|
+
|
|
212
|
+
## .work 静态门禁卡(v1.1 新增)
|
|
213
|
+
|
|
214
|
+
**v1.1 新增** `.work` 静态门禁卡:planLock(4 组件 hash)+ assets(域/蓝图 fileHash)+ context(goal/constraints/maxIterations)+ diagnostics(PR-14 软警告)。写一次后只读。
|
|
215
|
+
|
|
216
|
+
```json
|
|
217
|
+
{
|
|
218
|
+
"planLock": {
|
|
219
|
+
"workOxnHash": "64-hex SHA-256",
|
|
220
|
+
"workDomainsHash": "64-hex SHA-256",
|
|
221
|
+
"blueprintsHash": "64-hex SHA-256",
|
|
222
|
+
"tasksHash": "64-hex SHA-256",
|
|
223
|
+
"allHash": "64-hex SHA-256(4 组件综合)"
|
|
224
|
+
},
|
|
225
|
+
"assets": { "domains": [...], "blueprints": [...] },
|
|
226
|
+
"context": { "goal": "...", "constraints": [...], "maxIterations": 5 }
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`planLock` 内 `workOxnHash` / `workDomainsHash` / `blueprintsHash` / `tasksHash` / `allHash` 与 4 组件 hash 一起做 lock 守卫。
|
|
231
|
+
|
|
232
|
+
## work.oxn 4 大模式(AI 创作模板库)
|
|
233
|
+
|
|
234
|
+
> 下面 4 个模式对应 `src/oxl/examples/works/` 下的真实范例,可直接 fork 改写。
|
|
235
|
+
|
|
236
|
+
### 模式 1:单域单 task(explore 类)
|
|
237
|
+
|
|
238
|
+
**适用**:探索性工作(摸清一个域的结构 / 收集信息),不需要完整流水线。
|
|
239
|
+
|
|
240
|
+
**骨架**(参考 `examples/works/explore-dsl/work.oxn`):
|
|
241
|
+
|
|
242
|
+
```oxn
|
|
243
|
+
work "explore-dsl" {
|
|
244
|
+
context {
|
|
245
|
+
goal = "探索 OXL 语法结构,生成分析报告"
|
|
246
|
+
constraints = ["使用 oxn 命令而非直接读源码"]
|
|
247
|
+
loop_policy { max_iterations = 3 }
|
|
248
|
+
}
|
|
249
|
+
domain "DSLContext" ref "@prj/domains/dsl-context"
|
|
250
|
+
blueprint "explore-analyze-report" ref "@prj/blueprints/explore-analyze-report"
|
|
251
|
+
|
|
252
|
+
task "explore" {
|
|
253
|
+
domain "DSLContext"
|
|
254
|
+
blueprint "explore-analyze-report"
|
|
255
|
+
deps = []
|
|
256
|
+
part "explore" {
|
|
257
|
+
skill_context = "探索 grammar/schema/validator/compiler 四个子模块"
|
|
258
|
+
acceptance = [
|
|
259
|
+
"已读 src/oxl/langium/oxn.langium",
|
|
260
|
+
"已用 oxn dev compile 跑通一个范例",
|
|
261
|
+
"输出 .openxenon/works/<w>/report.md"
|
|
262
|
+
]
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**口诀**:1 work + 1 task + 1 domain + 1 blueprint(slot 数 = task 数)。
|
|
269
|
+
|
|
270
|
+
### 模式 2:单域多 part(develop 类)
|
|
271
|
+
|
|
272
|
+
**适用**:单域深度开发(一个限界上下文内的完整实现)。
|
|
273
|
+
|
|
274
|
+
```oxn
|
|
275
|
+
work "develop-member" {
|
|
276
|
+
context {
|
|
277
|
+
goal = "实现新会员注册功能"
|
|
278
|
+
constraints = [
|
|
279
|
+
"必须使用 MemberContext.term.Member,不能用 User/Customer",
|
|
280
|
+
"密码必须 hash 后存储"
|
|
281
|
+
]
|
|
282
|
+
loop_policy { max_iterations = 5 }
|
|
283
|
+
}
|
|
284
|
+
domain "MemberContext" ref "@prj/domains/member-context"
|
|
285
|
+
blueprint "dev-workflow" ref "@prj/blueprints/dev-workflow"
|
|
286
|
+
|
|
287
|
+
task "register-member" {
|
|
288
|
+
domain "MemberContext"
|
|
289
|
+
blueprint "dev-workflow"
|
|
290
|
+
deps = []
|
|
291
|
+
part "develop" { skill_context = "实现 Member 注册功能" }
|
|
292
|
+
part "test" { skill_context = "为 Member 注册写单测" }
|
|
293
|
+
part "verify" { skill_context = "端到端验证注册流程" }
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**口诀**:1 work + 1 task(带多 part,对齐 blueprint 的多个 slot)+ 1 domain。Part 数 = Blueprint slot 数。
|
|
299
|
+
|
|
300
|
+
### 模式 3:多 task 串行(fix 类)
|
|
301
|
+
|
|
302
|
+
```oxn
|
|
303
|
+
work "fix-issue" {
|
|
304
|
+
context {
|
|
305
|
+
goal = "修复 work state 在 submit 后未及时持久化的 bug"
|
|
306
|
+
constraints = ["不破坏现有 leader 状态机", "frozen.json 路径不能改"]
|
|
307
|
+
loop_policy { max_iterations = 5 }
|
|
308
|
+
}
|
|
309
|
+
domain "WorkContext" ref "@prj/domains/work-context"
|
|
310
|
+
blueprint "fix-issue" ref "@prj/blueprints/fix-issue"
|
|
311
|
+
|
|
312
|
+
task "diagnose" { domain "WorkContext"; blueprint "fix-issue"; deps = []
|
|
313
|
+
part "diagnose" { skill_context = "复现 bug,记录现场" }
|
|
314
|
+
}
|
|
315
|
+
task "locate" { domain "WorkContext"; blueprint "fix-issue"; deps = ["diagnose"]
|
|
316
|
+
part "locate" { skill_context = "定位根本原因" }
|
|
317
|
+
}
|
|
318
|
+
task "fix" { domain "WorkContext"; blueprint "fix-issue"; deps = ["locate"]
|
|
319
|
+
part "fix" { skill_context = "实施修复方案" }
|
|
320
|
+
}
|
|
321
|
+
task "verify" { domain "WorkContext"; blueprint "fix-issue"; deps = ["fix"]
|
|
322
|
+
part "verify" { skill_context = "验证修复结果" }
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**口诀**:N task 链式 `deps`,每个 task align 同一个 blueprint 的不同 slot。Domain 共享。
|
|
328
|
+
|
|
329
|
+
### 模式 4:跨域编排(onboarding 类)
|
|
330
|
+
|
|
331
|
+
```oxn
|
|
332
|
+
work "NewUserOnboarding" {
|
|
333
|
+
context {
|
|
334
|
+
goal = "完成新会员注册并发放欢迎福利"
|
|
335
|
+
constraints = ["不能直接读订单库", "必须调用订单上下文的能力"]
|
|
336
|
+
loop_policy { max_iterations = 5 }
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
domain "MemberContext" ref "@prj/domains/MemberContext"
|
|
340
|
+
domain "OrderContext" ref "@prj/domains/OrderContext"
|
|
341
|
+
blueprint "dev-workflow" ref "@prj/blueprints/dev-workflow"
|
|
342
|
+
|
|
343
|
+
task "RegisterMember" {
|
|
344
|
+
domain "MemberContext"
|
|
345
|
+
blueprint "dev-workflow"
|
|
346
|
+
deps = []
|
|
347
|
+
part "develop" {
|
|
348
|
+
skill_context = "实现 Member 注册 API,密码必须加密"
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**口诀**:work 级声明 N 个 domain,每个 task 按需 inject 1 个;domain 内部用 `term / ban / invariant` 三件套表达统一语言与硬规则;`invariant` 写法决策(1 条→单块单条 / 同主题→单块多条 / 异主题→多块按 `// ── <主题> ──` 分组)见 oxn-cli skill 的「invariant 写法决策树」章节,三者 IR 等价。
|
|
355
|
+
|
|
356
|
+
### 模式选择速查
|
|
357
|
+
|
|
358
|
+
| 你的需求 | 选哪个模式 | 关键标志 |
|
|
359
|
+
|---|---|---|
|
|
360
|
+
| 摸清一个域、写报告 | 模式 1(explore) | 1 task + 1 blueprint slot |
|
|
361
|
+
| 单域完整开发 | 模式 2(develop) | 1 task 多 part(= blueprint 多 slot) |
|
|
362
|
+
| bug 修复、流程化诊断 | 模式 3(fix) | N task 串行 deps |
|
|
363
|
+
| 跨多个限界上下文 | 模式 4(onboarding) | work 级 N domain + task 按需 inject |
|
|
364
|
+
|
|
365
|
+
## git 工作空间指引(v0.0.27+)
|
|
366
|
+
|
|
367
|
+
OXN 在 git worktree 场景下提供 **builtin `git-workflow` 蓝图**(`src/builtin/blueprints/git-workflow.oxn`),4 阶段 slot 全部对接 L1 git 适配器(`src/infra/git/workspace.ts`)+ 4 个 catalog 探针(`git-clean` / `git-branch-exists` / `git-status-clean` / `git-merge-feasible`)。
|
|
368
|
+
|
|
369
|
+
**核心边界**:**OXN 永远不替人 commit / push / merge**。它只观察并产出可合并性证据,让人类在 `git merge` 时消费。
|
|
370
|
+
|
|
371
|
+
### 派生 builtin 蓝图(标准 cp 约定)
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
oxn init
|
|
375
|
+
cp src/builtin/blueprints/git-workflow.oxn .openxenon/blueprints/git-workflow.oxn
|
|
376
|
+
oxn domain create ProgramContext # 至少含 term: WorkingTree / Branch / MergeCommit
|
|
377
|
+
oxn blueprint validate git-workflow
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### 与 work 8 阶段流程集成
|
|
381
|
+
|
|
382
|
+
```bash
|
|
383
|
+
oxn work create gw-feat-x --blueprint git-workflow
|
|
384
|
+
oxn work add-task gw-feat-x --task ship --blueprint git-workflow --domain ProgramContext
|
|
385
|
+
# 编辑 work.oxn + tasks/ship/task.oxn(4 part = 4 slot)
|
|
386
|
+
oxn work validate gw-feat-x --json
|
|
387
|
+
oxn work lock gw-feat-x --json
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### 人工 git 操作(OXN 不参与)
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
git worktree add -b feat/gw-feat-x ../wt-feat-x
|
|
394
|
+
cd ../wt-feat-x && $EDITOR files && git add -A && git commit -m "feat: ..."
|
|
395
|
+
cd -
|
|
396
|
+
oxn work run gw-feat-x --json
|
|
397
|
+
oxn work submit gw-feat-x --task ship --json # 4 次(4 part = 4 slot)
|
|
398
|
+
oxn work status gw-feat-x --json # overallStatus = passed
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### 拿到可合并性证据(关键)
|
|
402
|
+
|
|
403
|
+
`oxn work context` 不暴露 `checkMergeFeasibility`(写工作空间 → 违反 OXN 不替人决策边界)。要拿到证据,**手工调探针**或读 L1 适配器:
|
|
404
|
+
|
|
405
|
+
```bash
|
|
406
|
+
# E2E 测试演示(src/cli/__tests__/work-git-workspace-e2e.test.ts)
|
|
407
|
+
# 调 checkMergeFeasibility(branch, 'main', worktreePath):
|
|
408
|
+
# → can_ff_merge / can_merge_clean / has_conflicts / dirty_worktree / unknown
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
### 不做的事
|
|
412
|
+
|
|
413
|
+
- ❌ `oxn work create --worktree`(方案 C,未实现)
|
|
414
|
+
- ❌ OXN 替人 commit / merge(哲学边界)
|
|
415
|
+
- ❌ 锁后漂移源 `.oxn`(不会触发 planLock — 锁的是 per-work slim 索引 `works/<w>/blueprints.json`)
|
|
416
|
+
|
|
417
|
+
### 进一步阅读
|
|
418
|
+
|
|
419
|
+
- 详细设计:`docs/architecture/git-workflow-workspace.md`
|
|
420
|
+
- 4 probe 注册:`src/kernel/verdicts/catalog.ts:390-491`
|
|
421
|
+
- L1 适配器:`src/infra/git/workspace.ts:1-317`
|
|
422
|
+
- E2E 端到端验证:`src/cli/__tests__/work-git-workspace-e2e.test.ts`
|
|
423
|
+
|