@miniidealab/openlogos 0.5.8 → 0.5.10
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/dist/commands/detect.d.ts +16 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +51 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/init.d.ts +2 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +38 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/status.d.ts +21 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +78 -36
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/verify.d.ts +46 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +143 -60
- package/dist/commands/verify.js.map +1 -1
- package/dist/i18n.js +6 -6
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +1 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/json-output.d.ts +16 -0
- package/dist/lib/json-output.d.ts.map +1 -0
- package/dist/lib/json-output.js +25 -0
- package/dist/lib/json-output.js.map +1 -0
- package/package.json +1 -1
- package/skills/code-implementor/SKILL.en.md +195 -0
- package/skills/code-implementor/SKILL.md +195 -0
- package/spec/agents-md.md +8 -2
- package/spec/cli-json-output.md +278 -0
- package/spec/test-results.md +1 -1
- package/spec/workflow.md +2 -2
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# CLI JSON 结构化输出规格
|
|
2
|
+
|
|
3
|
+
> 版本: 1.0.0 | 创建日期: 2026-04-13
|
|
4
|
+
|
|
5
|
+
## 1. 概述
|
|
6
|
+
|
|
7
|
+
OpenLogos CLI 的 `status`、`verify`、`detect` 三个命令支持 `--format json` 参数,输出结构化 JSON 供外部工具(如 RunLogos)以编程方式消费。
|
|
8
|
+
|
|
9
|
+
### 1.1 通用约定
|
|
10
|
+
|
|
11
|
+
- **触发方式**:在命令后追加 `--format json`
|
|
12
|
+
- **输出目标**:JSON 输出到 **stdout**;错误信息仍输出到 **stderr**
|
|
13
|
+
- **JSON 格式**:紧凑单行输出(无缩进),方便管道处理
|
|
14
|
+
- **退出码**:与人类可读模式保持一致
|
|
15
|
+
- **编码**:UTF-8
|
|
16
|
+
- **字段命名**:snake_case
|
|
17
|
+
|
|
18
|
+
### 1.2 通用信封结构
|
|
19
|
+
|
|
20
|
+
所有命令的 JSON 输出共享同一信封结构:
|
|
21
|
+
|
|
22
|
+
```jsonc
|
|
23
|
+
{
|
|
24
|
+
"command": "<command-name>", // "status" | "verify" | "detect"
|
|
25
|
+
"version": "<cli-version>", // CLI 版本号,如 "0.5.9"
|
|
26
|
+
"timestamp": "<ISO-8601>", // 输出时间戳
|
|
27
|
+
"data": { ... } // 命令特定的数据负载
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. `openlogos detect --format json`
|
|
34
|
+
|
|
35
|
+
探测 CLI 版本和当前目录的项目信息。合并了 `--version` 的功能并扩展了项目探测能力。
|
|
36
|
+
|
|
37
|
+
### 2.1 用法
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
openlogos detect # 人类可读格式
|
|
41
|
+
openlogos detect --format json # JSON 格式
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 2.2 JSON Schema(data 部分)
|
|
45
|
+
|
|
46
|
+
```jsonc
|
|
47
|
+
{
|
|
48
|
+
"cli": {
|
|
49
|
+
"version": "0.5.9", // CLI 版本号
|
|
50
|
+
"node_version": "v22.0.0" // Node.js 运行时版本
|
|
51
|
+
},
|
|
52
|
+
"project": null | { // null 表示当前目录不是 OpenLogos 项目
|
|
53
|
+
"name": "my-project", // 项目名
|
|
54
|
+
"locale": "zh", // 语言设置
|
|
55
|
+
"lifecycle": "active", // "initial" | "active"
|
|
56
|
+
"description": "项目描述" // 项目描述
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 2.3 字段说明
|
|
62
|
+
|
|
63
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
64
|
+
|------|------|------|------|
|
|
65
|
+
| `cli.version` | string | 是 | CLI 包版本号 |
|
|
66
|
+
| `cli.node_version` | string | 是 | 当前 Node.js 版本(`process.version`)|
|
|
67
|
+
| `project` | object \| null | 是 | 若当前目录含 `logos/logos.config.json` 则返回项目信息,否则 null |
|
|
68
|
+
| `project.name` | string | 是 | 项目名(来自 config) |
|
|
69
|
+
| `project.locale` | string | 是 | 项目语言设置 |
|
|
70
|
+
| `project.lifecycle` | string | 是 | 项目生命周期阶段 |
|
|
71
|
+
| `project.description` | string | 是 | 项目描述 |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 3. `openlogos status --format json`
|
|
76
|
+
|
|
77
|
+
### 3.1 用法
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
openlogos status # 人类可读格式
|
|
81
|
+
openlogos status --format json # JSON 格式
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 3.2 JSON Schema(data 部分)
|
|
85
|
+
|
|
86
|
+
```jsonc
|
|
87
|
+
{
|
|
88
|
+
"phases": [
|
|
89
|
+
{
|
|
90
|
+
"key": "phase.1",
|
|
91
|
+
"label": "Phase 1 · 需求文档 (WHY)",
|
|
92
|
+
"done": true,
|
|
93
|
+
"files": ["01-requirements.md"]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"key": "phase.2",
|
|
97
|
+
"label": "Phase 2 · 产品设计 (WHAT)",
|
|
98
|
+
"done": false,
|
|
99
|
+
"files": []
|
|
100
|
+
}
|
|
101
|
+
// ... 所有 9 个 phase
|
|
102
|
+
],
|
|
103
|
+
"active_proposals": [
|
|
104
|
+
{
|
|
105
|
+
"name": "add-feature",
|
|
106
|
+
"has_proposal": true,
|
|
107
|
+
"has_tasks": true,
|
|
108
|
+
"delta_count": 3
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
"current_phase": "phase.2", // 第一个未完成 phase 的 key,若全部完成则为 null
|
|
112
|
+
"suggestion": "对 AI 说:「基于需求文档做产品设计」", // 建议的下一步操作
|
|
113
|
+
"all_done": false, // 是否所有 phase 都已完成
|
|
114
|
+
"lifecycle": "active" // 项目生命周期
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 3.3 字段说明
|
|
119
|
+
|
|
120
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
121
|
+
|------|------|------|------|
|
|
122
|
+
| `phases` | array | 是 | 所有阶段的状态列表(固定 9 个元素) |
|
|
123
|
+
| `phases[].key` | string | 是 | 阶段标识符(如 `phase.1`, `phase.3-2-api`) |
|
|
124
|
+
| `phases[].label` | string | 是 | 阶段的本地化标签 |
|
|
125
|
+
| `phases[].done` | boolean | 是 | 该阶段是否已完成(有文件 = true) |
|
|
126
|
+
| `phases[].files` | string[] | 是 | 该阶段目录下的文件列表 |
|
|
127
|
+
| `active_proposals` | array | 是 | 活跃变更提案列表 |
|
|
128
|
+
| `active_proposals[].name` | string | 是 | 提案目录名 |
|
|
129
|
+
| `active_proposals[].has_proposal` | boolean | 是 | 是否存在 proposal.md |
|
|
130
|
+
| `active_proposals[].has_tasks` | boolean | 是 | 是否存在 tasks.md |
|
|
131
|
+
| `active_proposals[].delta_count` | number | 是 | deltas 目录下的文件数 |
|
|
132
|
+
| `current_phase` | string \| null | 是 | 当前应推进的阶段 key;全部完成时为 null |
|
|
133
|
+
| `suggestion` | string | 是 | 建议的下一步操作(本地化文本) |
|
|
134
|
+
| `all_done` | boolean | 是 | 是否全部阶段已完成 |
|
|
135
|
+
| `lifecycle` | string | 是 | 项目生命周期(`initial` 或 `active`) |
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 4. `openlogos verify --format json`
|
|
140
|
+
|
|
141
|
+
### 4.1 用法
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
openlogos verify # 人类可读格式
|
|
145
|
+
openlogos verify --format json # JSON 格式
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 4.2 JSON Schema(data 部分)
|
|
149
|
+
|
|
150
|
+
```jsonc
|
|
151
|
+
{
|
|
152
|
+
"summary": {
|
|
153
|
+
"defined_count": 10, // 定义的测试用例总数
|
|
154
|
+
"ut_count": 6, // 单元测试用例数
|
|
155
|
+
"st_count": 4, // 场景测试用例数
|
|
156
|
+
"executed_count": 10, // 已执行的测试用例数
|
|
157
|
+
"passed_count": 8, // 通过数
|
|
158
|
+
"failed_count": 1, // 失败数
|
|
159
|
+
"skipped_count": 1, // 跳过数
|
|
160
|
+
"uncovered_count": 0, // 未覆盖数
|
|
161
|
+
"coverage_pct": 100, // 覆盖率百分比(整数)
|
|
162
|
+
"pass_rate_pct": 80 // 通过率百分比(整数)
|
|
163
|
+
},
|
|
164
|
+
"gate": {
|
|
165
|
+
"result": "FAIL", // "PASS" | "FAIL"
|
|
166
|
+
"reason": "failed_cases" // 失败原因分类,见下表
|
|
167
|
+
},
|
|
168
|
+
"failed_cases": [
|
|
169
|
+
{
|
|
170
|
+
"id": "UT-S01-03",
|
|
171
|
+
"error": "Expected 200, got 500"
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
"uncovered_cases": ["ST-S02-01"],
|
|
175
|
+
"skipped_cases": ["UT-S01-05"],
|
|
176
|
+
"checklist": {
|
|
177
|
+
"total": 5,
|
|
178
|
+
"checked": 5,
|
|
179
|
+
"unchecked_items": [] // 未确认的覆盖度校验项
|
|
180
|
+
},
|
|
181
|
+
"ac_trace": {
|
|
182
|
+
"total": 4,
|
|
183
|
+
"passed": 3,
|
|
184
|
+
"failed_criteria": [
|
|
185
|
+
{
|
|
186
|
+
"ac_id": "S01-AC-02",
|
|
187
|
+
"description": "异常处理",
|
|
188
|
+
"linked_case_ids": ["ST-S01-02"],
|
|
189
|
+
"status": "FAIL"
|
|
190
|
+
}
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
"report_path": "logos/resources/verify/acceptance-report.md"
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 4.3 字段说明
|
|
198
|
+
|
|
199
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
200
|
+
|------|------|------|------|
|
|
201
|
+
| `summary.defined_count` | number | 是 | 规格中定义的测试用例总数 |
|
|
202
|
+
| `summary.ut_count` | number | 是 | 其中的 UT 数量 |
|
|
203
|
+
| `summary.st_count` | number | 是 | 其中的 ST 数量 |
|
|
204
|
+
| `summary.executed_count` | number | 是 | 实际执行的用例数 |
|
|
205
|
+
| `summary.passed_count` | number | 是 | 通过的用例数 |
|
|
206
|
+
| `summary.failed_count` | number | 是 | 失败的用例数 |
|
|
207
|
+
| `summary.skipped_count` | number | 是 | 跳过的用例数 |
|
|
208
|
+
| `summary.uncovered_count` | number | 是 | 未覆盖的用例数 |
|
|
209
|
+
| `summary.coverage_pct` | number | 是 | 覆盖率(0-100 整数) |
|
|
210
|
+
| `summary.pass_rate_pct` | number | 是 | 通过率(0-100 整数) |
|
|
211
|
+
| `gate.result` | string | 是 | 门禁结果:`"PASS"` 或 `"FAIL"` |
|
|
212
|
+
| `gate.reason` | string \| null | 是 | FAIL 时的原因分类,PASS 时为 null |
|
|
213
|
+
| `failed_cases` | array | 是 | 失败的测试用例列表 |
|
|
214
|
+
| `uncovered_cases` | string[] | 是 | 未覆盖的用例 ID 列表 |
|
|
215
|
+
| `skipped_cases` | string[] | 是 | 跳过的用例 ID 列表 |
|
|
216
|
+
| `checklist.total` | number | 是 | 覆盖度校验项总数 |
|
|
217
|
+
| `checklist.checked` | number | 是 | 已确认的项数 |
|
|
218
|
+
| `checklist.unchecked_items` | array | 是 | 未确认项列表(含 text 和 file) |
|
|
219
|
+
| `ac_trace.total` | number | 是 | 验收条件总数 |
|
|
220
|
+
| `ac_trace.passed` | number | 是 | 通过的验收条件数 |
|
|
221
|
+
| `ac_trace.failed_criteria` | array | 是 | 未通过的验收条件列表 |
|
|
222
|
+
| `report_path` | string | 是 | 生成的验收报告路径 |
|
|
223
|
+
|
|
224
|
+
### 4.4 gate.reason 取值
|
|
225
|
+
|
|
226
|
+
| 值 | 说明 |
|
|
227
|
+
|----|------|
|
|
228
|
+
| `null` | 门禁通过 |
|
|
229
|
+
| `"failed_cases"` | 存在失败的测试用例 |
|
|
230
|
+
| `"incomplete_coverage"` | 存在未覆盖的测试用例 |
|
|
231
|
+
| `"checklist_incomplete"` | 设计时覆盖度校验未完全确认 |
|
|
232
|
+
| `"ac_trace_incomplete"` | 验收条件追溯未完全通过 |
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 5. 错误处理
|
|
237
|
+
|
|
238
|
+
当命令因错误退出时(如项目未初始化、找不到文件等),JSON 模式下输出错误 JSON 到 **stderr** 并以非零退出码退出:
|
|
239
|
+
|
|
240
|
+
```jsonc
|
|
241
|
+
{
|
|
242
|
+
"command": "<command-name>",
|
|
243
|
+
"version": "<cli-version>",
|
|
244
|
+
"timestamp": "<ISO-8601>",
|
|
245
|
+
"error": {
|
|
246
|
+
"code": "PROJECT_NOT_INITIALIZED",
|
|
247
|
+
"message": "logos/logos.config.json not found."
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### 5.1 错误码
|
|
253
|
+
|
|
254
|
+
| 错误码 | 说明 |
|
|
255
|
+
|--------|------|
|
|
256
|
+
| `PROJECT_NOT_INITIALIZED` | 当前目录不是 OpenLogos 项目 |
|
|
257
|
+
| `NO_TEST_RESULTS` | 找不到测试结果文件 |
|
|
258
|
+
| `NO_TEST_CASES` | 找不到测试用例规格文件 |
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 6. 完整用法示例
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
# 获取项目状态(机器可读)
|
|
266
|
+
openlogos status --format json | jq '.data.current_phase'
|
|
267
|
+
|
|
268
|
+
# 获取 CLI 版本和项目探测信息
|
|
269
|
+
openlogos detect --format json | jq '.data.cli.version'
|
|
270
|
+
|
|
271
|
+
# 获取测试验收摘要
|
|
272
|
+
openlogos verify --format json | jq '.data.gate.result'
|
|
273
|
+
|
|
274
|
+
# 在脚本中检查门禁结果
|
|
275
|
+
if openlogos verify --format json 2>/dev/null | jq -e '.data.gate.result == "PASS"' > /dev/null; then
|
|
276
|
+
echo "All tests passed!"
|
|
277
|
+
fi
|
|
278
|
+
```
|
package/spec/test-results.md
CHANGED
|
@@ -91,7 +91,7 @@ reporter 在写入前应确保 `logos/resources/verify/` 目录存在(`mkdir -
|
|
|
91
91
|
|
|
92
92
|
## AI 生成 reporter 代码模板
|
|
93
93
|
|
|
94
|
-
以下是各语言的 reporter 参考实现。AI 在 Phase 3 Step 4
|
|
94
|
+
以下是各语言的 reporter 参考实现。AI 在 Phase 3 Step 4(代码生成,由 `code-implementor` Skill 驱动)时,应根据项目的 `tech_stack` 选择对应语言的模板,嵌入到测试代码中。
|
|
95
95
|
|
|
96
96
|
### TypeScript (vitest / jest)
|
|
97
97
|
|
package/spec/workflow.md
CHANGED
|
@@ -224,9 +224,9 @@ Phase 2 在 Phase 1 场景的基础上增加交互细节:
|
|
|
224
224
|
|
|
225
225
|
**Gate 3.3b**:编排覆盖所有正常流程 + 核心异常流程。
|
|
226
226
|
|
|
227
|
-
### Step 4: AI 驱动代码生成 +
|
|
227
|
+
### Step 4: AI 驱动代码生成 + 测试代码(code-implementor Skill)
|
|
228
228
|
|
|
229
|
-
AI 面前已有完整上下文(原型 + 场景 + API + DB + 测试用例 +
|
|
229
|
+
AI 面前已有完整上下文(原型 + 场景 + API + DB + 测试用例 + 编排),此时生成的代码质量远高于直接写代码。按场景逐个生成、逐个验证。使用 `code-implementor` Skill 引导 AI 加载完整规格上下文、按场景分批实现、并确保代码与规格严格一致。
|
|
230
230
|
|
|
231
231
|
代码生成同时包括:
|
|
232
232
|
- **业务代码**:按时序图 Step 逐步实现
|