@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,366 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oxn-cli
|
|
3
|
+
description: 统一的 OpenXenon CLI 操作入口,把自然语言翻译成 oxn 命令并执行
|
|
4
|
+
---
|
|
5
|
+
# /oxn-cli — OpenXenon CLI 入口
|
|
6
|
+
|
|
7
|
+
> 这个 skill 教你怎么调用 OpenXenon 的 `oxn` 命令行工具(v0.1 hard-switch 后的 8 顶层命令)。
|
|
8
|
+
|
|
9
|
+
## 何时用
|
|
10
|
+
|
|
11
|
+
当你需要:
|
|
12
|
+
- 初始化项目(`oxn init`)
|
|
13
|
+
- 校验 .oxn 文件
|
|
14
|
+
- 获取 AI 工作上下文(`oxn work context`)
|
|
15
|
+
- 查询项目状态
|
|
16
|
+
- **创建 Intent(Domain / Blueprint 骨架)** — 详见本 skill 末尾的「Intent 创作最佳实践」
|
|
17
|
+
|
|
18
|
+
## 全局选项
|
|
19
|
+
|
|
20
|
+
所有命令支持:
|
|
21
|
+
- `-j, --json` — JSON 输出
|
|
22
|
+
- `-v, --verbose` — 详细输出
|
|
23
|
+
- `--help` — 帮助
|
|
24
|
+
|
|
25
|
+
## 常用命令
|
|
26
|
+
|
|
27
|
+
### 项目初始化
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
oxn init # 创建 .openxenon/ 边界
|
|
31
|
+
oxn config show # 查看项目配置
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Domain 管理
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
oxn domain create <DomainName> # 生成 Domain 骨架
|
|
38
|
+
oxn domain validate <DomainName> # 校验 Domain
|
|
39
|
+
oxn domain list # 列出所有 Domain
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Blueprint 管理
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
oxn blueprint create <name> [--slots a,b,c] # 生成 Blueprint 骨架
|
|
46
|
+
oxn blueprint validate <name> # 校验 Blueprint
|
|
47
|
+
oxn blueprint list # 列出所有 Blueprint
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Work / Task 生命周期
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
oxn work create <w> --blueprint <bp> # 从 Blueprint 生成 work 骨架(含 task 块)
|
|
54
|
+
oxn work add-task --work <w> --task-name <t> --blueprint <bp> [--domain <d>]
|
|
55
|
+
oxn work list-tasks --work <w>
|
|
56
|
+
oxn work task-status --work <w> --task <t>
|
|
57
|
+
oxn work run --work-file <work.oxn> # 启动状态机
|
|
58
|
+
oxn work submit --work-name <w> --task <t> # 推进 task
|
|
59
|
+
oxn work status --work-name <w> # 查询进度
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 获取 AI 上下文(**全量隔离**)
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Task 级:只看 task 注入的 domain
|
|
66
|
+
oxn work context --work <w> --task <t> --json
|
|
67
|
+
|
|
68
|
+
# Work 级:看 work 完整资源池(不隔离)
|
|
69
|
+
oxn work context --work <w> --json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Dev 工具(DSL 内部)
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
oxn dev compile <file.oxn> # OXL → AssemblyIR
|
|
76
|
+
oxn dev validate # 校验 .oxn 语法
|
|
77
|
+
oxn dev migrate-yaml <file> # YAML → OXL
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 反模式
|
|
81
|
+
|
|
82
|
+
- 不要在 AI 助手软件中跑 `oxn init`(已 init 过)
|
|
83
|
+
- 不要直接编辑 `.openxenon/works/<w>/state.json`(Core 独占)
|
|
84
|
+
- 不要在 Domain 内引用 asset(破坏 Asset Independence)
|
|
85
|
+
- 不要用 YAML/JSON 写 Blueprint(v0.1 起 OXL 单一权威)
|
|
86
|
+
- 不要调用 `oxn task *` / `oxn arsenal *` / `oxn leader *` / `oxn get-context` / `oxn add-probe` — **已彻底删除**
|
|
87
|
+
- 不要调用 `oxn work new` — 改用 `oxn work create`
|
|
88
|
+
- 不要调用 `oxn work task *` — 改用 `oxn work add-task` / `list-tasks` / `task-status` / `task-edit` / `task-delete`
|
|
89
|
+
- **不要试图 `oxn part new` / `oxn probe new`** — Part / Probe **不是独立资产**(设计上如此),它们在 `work create` 之后**内联**在 `work.oxn` / `task.oxn` 的 `task { part { ... } }` / `part { probe { ... } }` 块里写
|
|
90
|
+
- **不要用 `--name <X>` 命名参数** — 域/蓝图/work create 与 validate 都用 **positional `<name>`**(OXL 与 CLI 1:1 映射)
|
|
91
|
+
- **不要设计 `oxn domain append-term` / `oxn blueprint add-prop`** — Intent 资产用 `$EDITOR` 编辑,CLI 只提供脚手架(详见「Intent-Align CLI 哲学」)
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Intent 创作最佳实践
|
|
96
|
+
|
|
97
|
+
> **CLI 只生成「空骨架」**,Intent 的实际内容(DDD 词汇、slot 拓扑、prop schema、skill_context 文案)由 AI 填写。本节是填写指南。
|
|
98
|
+
|
|
99
|
+
### 1. Domain 创作(业务 Intent)
|
|
100
|
+
|
|
101
|
+
骨架(`oxn domain create` 产出)只有 TODO 占位。**好的 Domain 写法**(参考 `.openxenon/domains/work-context.oxn`):
|
|
102
|
+
|
|
103
|
+
```oxn
|
|
104
|
+
domain "MemberContext" {
|
|
105
|
+
description = "会员限界上下文:管理注册、认证、会员等级"
|
|
106
|
+
|
|
107
|
+
term { // ✅ 必填 ≥3 个核心实体
|
|
108
|
+
"Member": "注册会员实体"
|
|
109
|
+
"Account": "会员的登录凭证"
|
|
110
|
+
"Membership": "会员等级与权益记录"
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
ban { "User", "Customer", "AccountHolder" } // ✅ 必填 ≥2 个禁词
|
|
114
|
+
|
|
115
|
+
invariant { // ✅ 必填 ≥1 个不变量。写法决策见下方「invariant 写法决策树」
|
|
116
|
+
"密码任何时候都不能明文存储"
|
|
117
|
+
"同一邮箱在同一上下文内不可重复注册"
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**反模式**:
|
|
123
|
+
- ❌ term 只有 1 个词(粒度太粗)
|
|
124
|
+
- ❌ ban 列表为空(没有约束力)
|
|
125
|
+
- ❌ description 写「TODO: 描述业务边界」(CLI 占位,必须替换)
|
|
126
|
+
|
|
127
|
+
**口诀**:term 列实体,ban 列禁词,invariant 列硬规则;写法按下方「invariant 写法决策树」3 步反问(1 条→单块单条 / 同主题→单块多条 / 异主题→多块),IR 等价。
|
|
128
|
+
|
|
129
|
+
#### invariant 写法决策树
|
|
130
|
+
|
|
131
|
+
> 三种写法 IR 压平后等价(`OxnDomainIR.invariant: OxnInvariantDecl[]`)。
|
|
132
|
+
> AI 写新 Domain 时,**先问自己 3 步**,不要无脑拆多块。
|
|
133
|
+
|
|
134
|
+
**反问自己(3 步)**:
|
|
135
|
+
1. 只有 1 条不变量吗?→ 用**单块单条**:`invariant { "r1" }`
|
|
136
|
+
2. 多条不变量需要 `// ── <主题> ──` 注释分组(≥2 个不同主题)吗?→ 用**多块**(案例 A)
|
|
137
|
+
3. 否则?→ 用**单块多条**(案例 B,IR 等价、紧凑优先)
|
|
138
|
+
|
|
139
|
+
**案例 A — 多块(按主题分组)**:
|
|
140
|
+
|
|
141
|
+
```oxn
|
|
142
|
+
// ───── 字典收敛硬约束 ─────
|
|
143
|
+
invariant { "IAPError 字典 v1.0.2 收敛为 5 个" }
|
|
144
|
+
invariant { "OXNCrash 字典 v1.0.2 收敛为 3 个" }
|
|
145
|
+
|
|
146
|
+
// ───── 通道与进程契约 ─────
|
|
147
|
+
invariant { "IAPError 走 stdout JSON 通道" }
|
|
148
|
+
invariant { "OXNCrash 走 stderr stack 通道" }
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**案例 B — 单块多条(同主题紧凑)**:
|
|
152
|
+
|
|
153
|
+
```oxn
|
|
154
|
+
invariant {
|
|
155
|
+
"Work 的运行时类型必须与 Blueprint.type 强一致"
|
|
156
|
+
"frozen.json 生成后不可修改"
|
|
157
|
+
"work-trace.jsonl 只能追加写"
|
|
158
|
+
"同一 part 只能被提交一次"
|
|
159
|
+
"Artifact 路径必须落在 Work 沙盒内"
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**边界情况**:
|
|
164
|
+
- 1 条超长(>100 字)→ 单块单条独占,不混
|
|
165
|
+
- >5 条无主题 → 单块多条(避免视觉噪声)
|
|
166
|
+
- git diff 需要单条独立可见 → 多块
|
|
167
|
+
|
|
168
|
+
**反模式**:
|
|
169
|
+
- ❌ 只有 1 条还拆多块(`invariant {} invariant {}`)— 纯噪声
|
|
170
|
+
- ❌ 5+ 条无主题硬塞多块(reader 找不到分组线索)
|
|
171
|
+
- ❌ 同一文件混用单块多条/多块风格没有明显原因(破坏视觉一致性)
|
|
172
|
+
|
|
173
|
+
### 2. Blueprint 创作(技术 Intent)
|
|
174
|
+
|
|
175
|
+
骨架(`oxn blueprint create --slots`)默认生成**线性 slot DAG**:`a → b → c`。
|
|
176
|
+
|
|
177
|
+
**slot DAG 4 大模式**:
|
|
178
|
+
|
|
179
|
+
| 模式 | 适用场景 | 写法 |
|
|
180
|
+
|---|---|---|
|
|
181
|
+
| **linear pipeline** | 顺序执行 | `a → b → c`(CLI 默认) |
|
|
182
|
+
| **fan-out** | 一个起点并行 N | `split → { a, b }` |
|
|
183
|
+
| **fan-in** | N 合一 | `{ a, b } → merge` |
|
|
184
|
+
| **parallel + final** | 通用 | `build → { test, lint } → release` |
|
|
185
|
+
|
|
186
|
+
fan-out 例子:
|
|
187
|
+
```oxn
|
|
188
|
+
slot "split" { deps = [] }
|
|
189
|
+
slot "a" { deps = ["split"] }
|
|
190
|
+
slot "b" { deps = ["split"] }
|
|
191
|
+
slot "merge" { deps = ["a", "b"] }
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**prop 设计模式**(蓝图级参数,注入到所有 part):
|
|
195
|
+
|
|
196
|
+
```oxn
|
|
197
|
+
blueprint "dev-workflow" {
|
|
198
|
+
prop "env" { type = string; default = "dev" }
|
|
199
|
+
prop "timeout" { type = number; default = 30000 }
|
|
200
|
+
prop "branches" { type = list<string>; required = true }
|
|
201
|
+
|
|
202
|
+
slot "develop" { deps = []; observe = ["lint-check", "type-check"] }
|
|
203
|
+
slot "test" { deps = ["develop"]; observe = ["test-runner"] }
|
|
204
|
+
slot "verify" { deps = ["test"] }
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**observe 引用 builtin 探针**(`@oxn/...` 命名空间):
|
|
209
|
+
|
|
210
|
+
| builtin 名 | 用途 |
|
|
211
|
+
|---|---|
|
|
212
|
+
| `@oxn/probes/shell_exec` | 跑 shell 命令(返回 exit_code/stdout/stderr) |
|
|
213
|
+
| `@oxn/probes/fs_exists` | 检查文件/目录是否存在 |
|
|
214
|
+
| `@oxn/probes/lint-check` | 跑 linter |
|
|
215
|
+
| `@oxn/probes/test-runner` | 跑测试套件 |
|
|
216
|
+
| `@oxn/probes/type-check` | 跑类型检查 |
|
|
217
|
+
|
|
218
|
+
**反模式**:
|
|
219
|
+
- ❌ 永远线性 chain(哪怕分支更合理)— CLI 默认的诱惑
|
|
220
|
+
- ❌ slot 名用 PascalCase — 必须 kebab-case
|
|
221
|
+
- ❌ deps 里有 cycle — `oxn blueprint validate` 会拒绝
|
|
222
|
+
|
|
223
|
+
### 3. Part 内联创作(在 task 块 / work 块内)
|
|
224
|
+
|
|
225
|
+
> Part **没有独立文件**,**内联**在 `task "..." { part "..." { ... } }` 里。
|
|
226
|
+
|
|
227
|
+
**Part 字段语义**:
|
|
228
|
+
|
|
229
|
+
| 字段 | 必填 | AI 视角 |
|
|
230
|
+
|---|---|---|
|
|
231
|
+
| `lifecycle` | 可选 | `code` / `test` / `design` / `refactor`(默认 `code`) |
|
|
232
|
+
| `objective` / `skill_context` | ✅ 必填 | **做什么**(AI 第一句要读) |
|
|
233
|
+
| `acceptance` | ✅ 必填 | **可验收的产出**(AI 写完自检) |
|
|
234
|
+
| `guidance` | 可选 | **额外提示**(坑 / 约束 / 参考资料) |
|
|
235
|
+
|
|
236
|
+
**内联示例**:
|
|
237
|
+
|
|
238
|
+
```oxn
|
|
239
|
+
task "register-member" {
|
|
240
|
+
blueprint "dev-workflow"
|
|
241
|
+
domain "MemberContext"
|
|
242
|
+
|
|
243
|
+
part "develop" { // 名字与 blueprint slot 对齐
|
|
244
|
+
skill_context = "实现 Member 注册 API;密码必须 hash 存储" // objective
|
|
245
|
+
acceptance = [
|
|
246
|
+
"POST /api/members 接收 {username, email, password}",
|
|
247
|
+
"密码用 bcrypt(cost≥12)hash 后入库",
|
|
248
|
+
"已写 OpenAPI schema"
|
|
249
|
+
]
|
|
250
|
+
guidance = "参考 .openxenon/domains/member-context.oxn 的 ban 列表"
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
part "test" {
|
|
254
|
+
skill_context = "为 Member 注册写单测"
|
|
255
|
+
acceptance = ["≥80% 行覆盖", "边界用例:弱密码 / 重复邮箱 / 注入"]
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**反模式**:
|
|
261
|
+
- ❌ skill_context 只写"实现"(太抽象,AI 不知道要什么)
|
|
262
|
+
- ❌ acceptance 用模糊词("好"/"完成")— 必须可机器验证
|
|
263
|
+
- ❌ part 名与 blueprint slot 不对齐
|
|
264
|
+
|
|
265
|
+
### 4. Probe 内联创作(在 part 块内)
|
|
266
|
+
|
|
267
|
+
> Probe **没有独立文件**,**内联**在 `part "..." { probe "..." { ... } }` 里。
|
|
268
|
+
|
|
269
|
+
**场景 A:引用 builtin 探针**(推荐):
|
|
270
|
+
|
|
271
|
+
```oxn
|
|
272
|
+
slot "verify" {
|
|
273
|
+
deps = ["test"]
|
|
274
|
+
observe = ["shell-exec", "fs-exists"] // 引用 builtin 名
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**场景 B:内联自定义探针**(builtin 不够用时):
|
|
279
|
+
|
|
280
|
+
```oxn
|
|
281
|
+
part "verify" {
|
|
282
|
+
skill_context = "校验密码强度"
|
|
283
|
+
|
|
284
|
+
probe "check-password-strength" { // 内联在 part 块内
|
|
285
|
+
prop "password" { type = string; required = true }
|
|
286
|
+
prop "min-length" { type = number; default = 8 }
|
|
287
|
+
output { ok = boolean; score = number }
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**Probe 字段语义**:
|
|
293
|
+
|
|
294
|
+
| 字段 | 必填 | 含义 |
|
|
295
|
+
|---|---|---|
|
|
296
|
+
| `description` | 推荐 | 探针做什么 |
|
|
297
|
+
| `prop "<name>"` | 按需 | 输入参数:`type` 必填;可加 `required` / `default` |
|
|
298
|
+
| `output` | 必填 | 输出字段:`name = type` 形式 |
|
|
299
|
+
|
|
300
|
+
**反模式**:
|
|
301
|
+
- ❌ 用 builtin 能解决却自己造轮子
|
|
302
|
+
- ❌ probe 没 output(kernel 不知道如何判定 pass/fail)
|
|
303
|
+
- ❌ prop 缺 `type`(语法报错)
|
|
304
|
+
|
|
305
|
+
### 5. work.oxn 完整填空示例
|
|
306
|
+
|
|
307
|
+
`oxn work create my-feature --blueprint dev-workflow` 生成:
|
|
308
|
+
|
|
309
|
+
```oxn
|
|
310
|
+
work "my-feature" {
|
|
311
|
+
context { goal = "TODO"; constraints = ["TODO"]; loop_policy { max_iterations = 3 } }
|
|
312
|
+
blueprint "dev-workflow" ref "@prj/blueprints/dev-workflow";
|
|
313
|
+
task "develop" {
|
|
314
|
+
blueprint "dev-workflow"
|
|
315
|
+
part "slot-name" { skill_context = "TODO" }
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**AI 填空**:
|
|
321
|
+
|
|
322
|
+
```oxn
|
|
323
|
+
work "my-feature" {
|
|
324
|
+
context {
|
|
325
|
+
goal = "实现新会员注册功能"
|
|
326
|
+
constraints = [
|
|
327
|
+
"必须用 MemberContext.term.Member,不能用 User/Customer",
|
|
328
|
+
"密码必须 hash 后存储"
|
|
329
|
+
]
|
|
330
|
+
loop_policy { max_iterations = 5 }
|
|
331
|
+
}
|
|
332
|
+
blueprint "dev-workprint" ref "@prj/blueprints/dev-workflow";
|
|
333
|
+
|
|
334
|
+
task "develop" {
|
|
335
|
+
blueprint "dev-workflow"
|
|
336
|
+
domain "MemberContext"
|
|
337
|
+
part "develop" { // ← 改成与 blueprint slot 对齐
|
|
338
|
+
skill_context = "实现 Member 注册 API,密码用 bcrypt hash 存储"
|
|
339
|
+
acceptance = [
|
|
340
|
+
"POST /api/members 接口可用",
|
|
341
|
+
"密码 hash 存储,无明文"
|
|
342
|
+
]
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### 6. 校验流程
|
|
349
|
+
|
|
350
|
+
写完一个 Intent 后**永远跑这三步**:
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
oxn domain validate <name>
|
|
354
|
+
oxn blueprint validate <name>
|
|
355
|
+
oxn work validate --path <work.oxn>
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
**详细参考**:`src/oxl/examples/works/` 下有 4 个完整范例(explore-dsl / develop-member / fix-issue / onboarding),可作模板直接仿写。
|
|
359
|
+
|
|
360
|
+
## 详细参考
|
|
361
|
+
|
|
362
|
+
- [CLI 命令参考](../../../docs/reference/cli-reference.md)
|
|
363
|
+
- [OXL 参考](../../../docs/reference/oxl.md)
|
|
364
|
+
- [Blueprint 格式参考(含 slot DAG 4 模式)](../../../docs/reference/blueprint-format.md)
|
|
365
|
+
- [work.oxn 4 大模式](../../../docs/architecture/work-and-task.md)
|
|
366
|
+
|