@miniidealab/openlogos 0.5.9 → 0.6.0
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 +20 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +55 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +14 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/status.d.ts +25 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +85 -36
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +6 -0
- package/dist/commands/sync.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.d.ts +1 -1
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +8 -3
- 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 +14 -3
- 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 +7 -3
- package/skills/code-implementor/SKILL.md +7 -3
- package/spec/cli-json-output.md +278 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const VERSION = '0.6.0';
|
|
2
|
+
export function parseFormat(args) {
|
|
3
|
+
const idx = args.indexOf('--format');
|
|
4
|
+
if (idx !== -1 && args[idx + 1] === 'json') {
|
|
5
|
+
return 'json';
|
|
6
|
+
}
|
|
7
|
+
return 'text';
|
|
8
|
+
}
|
|
9
|
+
export function makeEnvelope(command, data) {
|
|
10
|
+
return {
|
|
11
|
+
command,
|
|
12
|
+
version: VERSION,
|
|
13
|
+
timestamp: new Date().toISOString(),
|
|
14
|
+
data,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function makeErrorEnvelope(command, code, message) {
|
|
18
|
+
return {
|
|
19
|
+
command,
|
|
20
|
+
version: VERSION,
|
|
21
|
+
timestamp: new Date().toISOString(),
|
|
22
|
+
error: { code, message },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=json-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/lib/json-output.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAI/B,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAaD,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAa;IACzD,OAAO;QACL,OAAO;QACP,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAY,EAAE,OAAe;IAC9E,OAAO;QACL,OAAO;QACP,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KACzB,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -54,12 +54,14 @@ test-writer writes no code; code-implementor designs no test cases; code-reviewe
|
|
|
54
54
|
| Test case specs | `logos/resources/test/*-test-cases.md` | Verification targets — UT/ST IDs, expected inputs/outputs |
|
|
55
55
|
| Orchestration tests | `logos/resources/scenario/*.json` | End-to-end verification targets (API projects) |
|
|
56
56
|
| Project config | `logos/logos-project.yaml` | `tech_stack`, `external_dependencies` |
|
|
57
|
+
| Source roots | `logos/logos.config.json` → `sourceRoots` | Output root directories for business code and test code |
|
|
57
58
|
|
|
58
59
|
After loading, confirm:
|
|
59
60
|
- Which scenarios are in scope (S01, S02...)
|
|
60
61
|
- Which API endpoints and DB tables are involved
|
|
61
62
|
- Total UT/ST case count
|
|
62
63
|
- Technology stack confirmation (language, framework, test framework)
|
|
64
|
+
- Source output directories confirmed (read `sourceRoots.src` and `sourceRoots.test`; default to `src/` and `test/` if absent)
|
|
63
65
|
|
|
64
66
|
### Step 2: Plan Batch Strategy
|
|
65
67
|
|
|
@@ -163,16 +165,18 @@ After each batch:
|
|
|
163
165
|
1. **Prompt to run tests**: Tell the user the test command (e.g., `npm test`, `pytest`)
|
|
164
166
|
2. **Prompt to check results**: Confirm `logos/resources/verify/test-results.jsonl` was generated
|
|
165
167
|
3. **After all batches complete**: Guide the user to run `openlogos verify` for Gate 3.5 acceptance
|
|
168
|
+
4. **Update sourceRoots**: If the actual source directories differ from `sourceRoots` in `logos.config.json`, update the config to reflect the real paths. For example, if business code is placed in `app/` instead of the default `src/`, update `sourceRoots.src` to `["app"]`
|
|
169
|
+
5. **Write implementation manifest**: Create an implementation manifest file in `logos/resources/implementation/` (e.g., `implementation-manifest.md`) recording the scenarios, endpoints, and case IDs covered, marking Phase 3-4 as complete
|
|
166
170
|
|
|
167
171
|
If the user wants a quality audit, suggest using the `code-reviewer` Skill.
|
|
168
172
|
|
|
169
173
|
## Output Specification
|
|
170
174
|
|
|
171
|
-
- **Business code**: Output to the
|
|
172
|
-
- **Test code**: Output to the
|
|
175
|
+
- **Business code**: Output to the directories specified by `sourceRoots.src` (default `src/`, as configured in `logos.config.json`)
|
|
176
|
+
- **Test code**: Output to the directories specified by `sourceRoots.test` (default `test/`, as configured in `logos.config.json`)
|
|
173
177
|
- **Reporter**: Embedded in test code (not a standalone file)
|
|
174
178
|
- **JSONL results**: `logos/resources/verify/test-results.jsonl`
|
|
175
|
-
-
|
|
179
|
+
- **Implementation manifest**: `logos/resources/implementation/implementation-manifest.md` (created after all batches complete)
|
|
176
180
|
|
|
177
181
|
## Best Practices
|
|
178
182
|
|
|
@@ -54,12 +54,14 @@ test-writer 不写代码;code-implementor 不设计用例;code-reviewer 不
|
|
|
54
54
|
| 测试用例规格 | `logos/resources/test/*-test-cases.md` | 验证目标——UT/ST ID、预期输入输出 |
|
|
55
55
|
| 编排测试 | `logos/resources/scenario/*.json` | 端到端验证目标(API 项目) |
|
|
56
56
|
| 项目配置 | `logos/logos-project.yaml` | `tech_stack`、`external_dependencies` |
|
|
57
|
+
| 源码位置 | `logos/logos.config.json` → `sourceRoots` | 业务代码和测试代码的输出根目录 |
|
|
57
58
|
|
|
58
59
|
读取完成后,确认以下信息:
|
|
59
60
|
- 本次实现涉及哪些场景(S01、S02...)
|
|
60
61
|
- 涉及哪些 API 端点和 DB 表
|
|
61
62
|
- 对应的 UT/ST 用例总数
|
|
62
63
|
- 技术栈确认(语言、框架、测试框架)
|
|
64
|
+
- 源码输出目录确认(读取 `sourceRoots.src` 和 `sourceRoots.test`,若不存在则默认 `src/` 和 `test/`)
|
|
63
65
|
|
|
64
66
|
### Step 2: 规划分批策略
|
|
65
67
|
|
|
@@ -163,16 +165,18 @@ test-writer 不写代码;code-implementor 不设计用例;code-reviewer 不
|
|
|
163
165
|
1. **提示运行测试**:告诉用户运行测试命令(如 `npm test`、`pytest`)
|
|
164
166
|
2. **提示检查结果**:确认 `logos/resources/verify/test-results.jsonl` 已生成
|
|
165
167
|
3. **所有批次完成后**:引导用户运行 `openlogos verify` 执行 Gate 3.5 验收
|
|
168
|
+
4. **更新 sourceRoots**:如果实际使用的源码目录与 `logos.config.json` 中的 `sourceRoots` 不同,更新配置文件以反映实际路径。例如,如果业务代码放在 `app/` 而非默认的 `src/`,将 `sourceRoots.src` 更新为 `["app"]`
|
|
169
|
+
5. **写入实现清单**:在 `logos/resources/implementation/` 目录下创建实现清单文件(如 `implementation-manifest.md`),记录本次实现覆盖的场景、端点、用例 ID 等信息,标记 Phase 3-4 完成
|
|
166
170
|
|
|
167
171
|
如果用户希望审查代码质量,引导使用 `code-reviewer` Skill。
|
|
168
172
|
|
|
169
173
|
## 输出规范
|
|
170
174
|
|
|
171
|
-
-
|
|
172
|
-
-
|
|
175
|
+
- **业务代码**:输出到 `sourceRoots.src` 指定的目录(默认 `src/`,以 `logos.config.json` 配置为准)
|
|
176
|
+
- **测试代码**:输出到 `sourceRoots.test` 指定的目录(默认 `test/`,以 `logos.config.json` 配置为准)
|
|
173
177
|
- **Reporter**:嵌入测试代码中(非独立文件)
|
|
174
178
|
- **JSONL 结果**:`logos/resources/verify/test-results.jsonl`
|
|
175
|
-
-
|
|
179
|
+
- **实现清单**:`logos/resources/implementation/implementation-manifest.md`(所有批次完成后创建)
|
|
176
180
|
|
|
177
181
|
## 实践经验
|
|
178
182
|
|
|
@@ -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
|
+
```
|