@bf-meishijian/aip 0.0.30 → 0.0.32
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/README.md +16 -18
- package/dist/aip-submit-outcome/SKILL.md +20 -47
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/coding-run-manager.d.ts +2 -3
- package/dist/coding-run-manager.d.ts.map +1 -1
- package/dist/coding-run-manager.js +52 -49
- package/dist/coding-run-manager.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +20 -4
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-tools.d.ts.map +1 -1
- package/dist/delivery-tools.js +2 -0
- package/dist/delivery-tools.js.map +1 -1
- package/dist/diagnostics.d.ts +1 -1
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +1 -1
- package/dist/diagnostics.js.map +1 -1
- package/dist/general-run-client.d.ts.map +1 -1
- package/dist/general-run-manager.d.ts.map +1 -1
- package/dist/general-run-manager.js +0 -1
- package/dist/general-run-manager.js.map +1 -1
- package/dist/general-run-tools.d.ts +1 -1
- package/dist/general-run-tools.d.ts.map +1 -1
- package/dist/general-run-tools.js +1 -1
- package/dist/general-run-tools.js.map +1 -1
- package/dist/generated/qa-schemas.js +1123 -0
- package/dist/handoff-cli.d.ts +2 -0
- package/dist/handoff-cli.d.ts.map +1 -0
- package/dist/handoff-cli.js +86 -0
- package/dist/handoff-cli.js.map +1 -0
- package/dist/host-log.d.ts +2 -0
- package/dist/host-log.d.ts.map +1 -1
- package/dist/host-log.js +5 -2
- package/dist/host-log.js.map +1 -1
- package/dist/host-shell.d.ts +2 -0
- package/dist/host-shell.d.ts.map +1 -0
- package/dist/host-shell.js +11 -0
- package/dist/host-shell.js.map +1 -0
- package/dist/host-status.d.ts.map +1 -1
- package/dist/host-status.js +1 -0
- package/dist/host-status.js.map +1 -1
- package/dist/live-employee.js +2 -2
- package/dist/live-employee.js.map +1 -1
- package/dist/local-employee-runtime.d.ts +1 -1
- package/dist/local-employee-runtime.d.ts.map +1 -1
- package/dist/local-employee-runtime.js +1 -1
- package/dist/local-employee-runtime.js.map +1 -1
- package/dist/local-handoff-workspace.d.ts +8 -1
- package/dist/local-handoff-workspace.d.ts.map +1 -1
- package/dist/local-handoff-workspace.js +14 -34
- package/dist/local-handoff-workspace.js.map +1 -1
- package/dist/local-mcp.d.ts +110 -1
- package/dist/local-mcp.d.ts.map +1 -1
- package/dist/local-mcp.js +22 -2
- package/dist/local-mcp.js.map +1 -1
- package/dist/outcome-cli.d.ts +1 -0
- package/dist/outcome-cli.d.ts.map +1 -1
- package/dist/outcome-cli.js +43 -54
- package/dist/outcome-cli.js.map +1 -1
- package/dist/pi-message-queue.d.ts +5 -0
- package/dist/pi-message-queue.d.ts.map +1 -1
- package/dist/pi-message-queue.js +21 -0
- package/dist/pi-message-queue.js.map +1 -1
- package/dist/pi-model-service.d.ts.map +1 -1
- package/dist/platform-client.d.ts +7 -4
- package/dist/platform-client.d.ts.map +1 -1
- package/dist/platform-client.js +23 -6
- package/dist/platform-client.js.map +1 -1
- package/dist/project-facts.d.ts.map +1 -1
- package/dist/project-facts.js +5 -0
- package/dist/project-facts.js.map +1 -1
- package/dist/qa-ajv.js +9 -0
- package/dist/qa-contract.d.ts +1 -1
- package/dist/qa-contract.d.ts.map +1 -1
- package/dist/qa-contract.js +18 -90
- package/dist/qa-contract.js.map +1 -1
- package/dist/qa-http-validation.js +5 -133
- package/dist/qa-project-checkout.d.ts +6 -2
- package/dist/qa-project-checkout.d.ts.map +1 -1
- package/dist/qa-project-checkout.js +19 -12
- package/dist/qa-project-checkout.js.map +1 -1
- package/dist/qa-session-manager.d.ts +4 -8
- package/dist/qa-session-manager.d.ts.map +1 -1
- package/dist/qa-session-manager.js +121 -107
- package/dist/qa-session-manager.js.map +1 -1
- package/dist/qa-tool-arguments.js +336 -0
- package/dist/stage-delivery.js +6 -4
- package/dist/state.d.ts +2 -2
- package/dist/state.js +2 -2
- package/dist/test-cli.d.ts.map +1 -1
- package/dist/test-cli.js +1 -3
- package/dist/test-cli.js.map +1 -1
- package/dist/test-executor.d.ts +2 -2
- package/dist/test-executor.d.ts.map +1 -1
- package/dist/test-executor.js +14 -9
- package/dist/test-executor.js.map +1 -1
- package/dist/test-reports.d.ts +13 -1
- package/dist/test-reports.d.ts.map +1 -1
- package/dist/tool-dispatch.d.ts.map +1 -1
- package/dist/tool-dispatch.js +3 -0
- package/dist/tool-dispatch.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
// ../../packages/api-contracts/src/qa-tool-arguments.ts
|
|
2
|
+
import { Ajv } from "ajv";
|
|
3
|
+
import addFormats from "ajv-formats";
|
|
4
|
+
|
|
5
|
+
// ../../packages/api-contracts/src/generated/qa-verification-tools.ts
|
|
6
|
+
var QA_VERIFICATION_TOOL_DEFINITIONS = [
|
|
7
|
+
{
|
|
8
|
+
"name": "submit_qa_verification",
|
|
9
|
+
"label": "\u63D0\u4EA4\u5B9E\u6D4B\u7ED3\u679C",
|
|
10
|
+
"description": '\u53EA\u63D0\u4EA4\u5DF2\u5B9E\u9645\u6267\u884C\u7684\u6D4B\u8BD5\u7ED3\u679C\uFF1B\u622A\u56FE\u4F7F\u7528\u672C\u5730\u8DEF\u5F84\u3002\u6D4F\u89C8\u5668\u5B9E\u6D4B\u5FC5\u987B\u6709\u622A\u56FE\uFF0C\u975E\u6D4F\u89C8\u5668\u53EF\u4F20\u7A7A\u6570\u7EC4\u3002\u65E0\u6CD5\u9A8C\u8BC1\u987B\u586B\u5199 unverifiableReason\u3002\u6458\u8981 content \u548C\u7EC6\u5206 checkpoints \u9009\u586B\uFF1BAC \u7531\u6D4B\u8BD5\u9879\u81EA\u52A8\u5173\u8054\u3002\u590D\u7528\u5DF2\u6709\u8BC1\u636E\u7528 reuse_qa_verification\uFF0C\u7533\u8BF7\u8C41\u514D\u7528 request_qa_waiver\u3002\u6700\u5C0F\u793A\u4F8B\uFF1A{"testItemIds":["TC-001"],"conclusion":"PASSED","expected":"\u56DB\u5361\u6B63\u786E\u663E\u793A","actual":"\u56DB\u5361\u4E0E\u67E5\u8BE2\u7ED3\u679C\u4E00\u81F4","steps":["\u6253\u5F00\u9875\u9762\u5E76\u6838\u5BF9\u7EDF\u8BA1"],"screenshots":["evidence.png"]}\u3002',
|
|
11
|
+
"execution": "HOST",
|
|
12
|
+
"handler": "submit_qa_verification",
|
|
13
|
+
"parameters": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"additionalProperties": false,
|
|
16
|
+
"properties": {
|
|
17
|
+
"testItemIds": {
|
|
18
|
+
"type": "array",
|
|
19
|
+
"minItems": 1,
|
|
20
|
+
"uniqueItems": true,
|
|
21
|
+
"items": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"minLength": 1,
|
|
24
|
+
"pattern": "\\S"
|
|
25
|
+
},
|
|
26
|
+
"description": "read_qa_test_plan \u8FD4\u56DE\u7684\u5F53\u524D\u6D4B\u8BD5\u9879\u7F16\u53F7\uFF0C\u4F8B\u5982 TC-001\uFF1B\u4E0D\u586B\u5199\u6570\u636E\u5E93 UUID\u3002"
|
|
27
|
+
},
|
|
28
|
+
"conclusion": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"enum": [
|
|
31
|
+
"PASSED",
|
|
32
|
+
"FAILED",
|
|
33
|
+
"UNVERIFIABLE"
|
|
34
|
+
],
|
|
35
|
+
"description": "\u6574\u4F53\u5B9E\u6D4B\u7ED3\u8BBA\uFF0C\u4F7F\u7528\u5927\u5199 PASSED\uFF08\u901A\u8FC7\uFF09\u3001FAILED\uFF08\u5931\u8D25\uFF09\u3001UNVERIFIABLE\uFF08\u65E0\u6CD5\u9A8C\u8BC1\uFF09\u3002"
|
|
36
|
+
},
|
|
37
|
+
"expected": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"minLength": 1,
|
|
40
|
+
"maxLength": 2e4,
|
|
41
|
+
"pattern": "\\S",
|
|
42
|
+
"description": "\u672C\u6B21\u9A8C\u8BC1\u6574\u4F53\u9884\u671F\uFF1B\u5177\u4F53\u5230\u53EF\u4EE5\u5224\u65AD\u662F\u5426\u6EE1\u8DB3\u3002"
|
|
43
|
+
},
|
|
44
|
+
"actual": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"minLength": 1,
|
|
47
|
+
"maxLength": 2e4,
|
|
48
|
+
"pattern": "\\S",
|
|
49
|
+
"description": "\u672C\u6B21\u9A8C\u8BC1\u5B9E\u9645\u89C2\u5BDF\u7ED3\u679C\uFF1B\u4E0D\u586B\u5199\u9884\u671F\u6216\u5360\u4F4D\u6587\u5B57\u3002"
|
|
50
|
+
},
|
|
51
|
+
"steps": {
|
|
52
|
+
"type": "array",
|
|
53
|
+
"minItems": 1,
|
|
54
|
+
"items": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"minLength": 1,
|
|
57
|
+
"maxLength": 2e4,
|
|
58
|
+
"pattern": "\\S",
|
|
59
|
+
"description": "\u5DF2\u5B9E\u9645\u6267\u884C\u7684\u64CD\u4F5C\uFF1B\u6BCF\u9879\u586B\u5199\u5B57\u7B26\u4E32\u3002"
|
|
60
|
+
},
|
|
61
|
+
"description": "\u6309\u6267\u884C\u987A\u5E8F\u5217\u51FA\u771F\u5B9E\u6B65\u9AA4\u3002"
|
|
62
|
+
},
|
|
63
|
+
"screenshots": {
|
|
64
|
+
"type": "array",
|
|
65
|
+
"minItems": 0,
|
|
66
|
+
"maxItems": 20,
|
|
67
|
+
"items": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"minLength": 1,
|
|
70
|
+
"pattern": "\\S"
|
|
71
|
+
},
|
|
72
|
+
"uniqueItems": true,
|
|
73
|
+
"description": "\u771F\u5B9E\u622A\u56FE\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E2D\u7684\u76F8\u5BF9\u8DEF\u5F84\u6216\u76EE\u5F55\u5185\u7EDD\u5BF9\u8DEF\u5F84\uFF1BHost \u81EA\u52A8\u4E0A\u4F20\uFF0C\u65E0\u9700 Base64 \u6216\u9644\u4EF6 ID\u3002\u975E\u6D4F\u89C8\u5668\u9A8C\u8BC1\u53EF\u4F20\u7A7A\u6570\u7EC4\u3002"
|
|
74
|
+
},
|
|
75
|
+
"content": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"minLength": 1,
|
|
78
|
+
"maxLength": 2e4,
|
|
79
|
+
"pattern": "\\S",
|
|
80
|
+
"description": "\u53EF\u9009\u7684\u4E00\u53E5\u8BDD\u6458\u8981\uFF1B\u4E0D\u586B\u65F6\u5C55\u793A\u5B9E\u9645\u7ED3\u679C\uFF0C\u65E0\u9700\u91CD\u590D\u9884\u671F\u548C\u6B65\u9AA4\u3002"
|
|
81
|
+
},
|
|
82
|
+
"checkpoints": {
|
|
83
|
+
"type": "array",
|
|
84
|
+
"items": {
|
|
85
|
+
"type": "object",
|
|
86
|
+
"additionalProperties": false,
|
|
87
|
+
"properties": {
|
|
88
|
+
"group": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"minLength": 1,
|
|
91
|
+
"maxLength": 2e4,
|
|
92
|
+
"pattern": "\\S",
|
|
93
|
+
"description": "\u68C0\u67E5\u70B9\u5206\u7EC4\uFF0C\u5982\u9ED8\u8BA4\u52A0\u8F7D\u3002"
|
|
94
|
+
},
|
|
95
|
+
"title": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"minLength": 1,
|
|
98
|
+
"maxLength": 2e4,
|
|
99
|
+
"pattern": "\\S",
|
|
100
|
+
"description": "\u5177\u4F53\u68C0\u67E5\u70B9\u540D\u79F0\u3002"
|
|
101
|
+
},
|
|
102
|
+
"expected": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"minLength": 1,
|
|
105
|
+
"maxLength": 2e4,
|
|
106
|
+
"pattern": "\\S",
|
|
107
|
+
"description": "\u8BE5\u68C0\u67E5\u70B9\u7684\u9884\u671F\u3002"
|
|
108
|
+
},
|
|
109
|
+
"actual": {
|
|
110
|
+
"type": "string",
|
|
111
|
+
"minLength": 1,
|
|
112
|
+
"maxLength": 2e4,
|
|
113
|
+
"pattern": "\\S",
|
|
114
|
+
"description": "\u8BE5\u68C0\u67E5\u70B9\u5B9E\u9645\u89C2\u5BDF\u5230\u7684\u7ED3\u679C\u3002"
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"required": [
|
|
118
|
+
"group",
|
|
119
|
+
"title",
|
|
120
|
+
"expected",
|
|
121
|
+
"actual"
|
|
122
|
+
]
|
|
123
|
+
},
|
|
124
|
+
"description": "\u53EF\u9009\u7684\u7EC6\u5206\u68C0\u67E5\u70B9\uFF1B\u53EA\u6709\u9700\u8981\u9010\u9879\u8BB0\u5F55\u65F6\u586B\u5199\uFF0C\u65E0\u9700\u91CD\u590D\u6574\u4F53\u9884\u671F\u548C\u5B9E\u9645\u3002"
|
|
125
|
+
},
|
|
126
|
+
"unverifiableReason": {
|
|
127
|
+
"type": "string",
|
|
128
|
+
"maxLength": 2e4,
|
|
129
|
+
"description": "\u4EC5 UNVERIFIABLE \u65F6\u5FC5\u987B\u586B\u5199\u771F\u5B9E\u975E\u7A7A\u539F\u56E0\uFF1BPASSED/FAILED \u53EF\u7701\u7565\u6216\u7559\u7A7A\u3002"
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"required": [
|
|
133
|
+
"testItemIds",
|
|
134
|
+
"conclusion",
|
|
135
|
+
"expected",
|
|
136
|
+
"actual",
|
|
137
|
+
"steps",
|
|
138
|
+
"screenshots"
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"name": "reuse_qa_verification",
|
|
144
|
+
"label": "\u5F15\u7528\u539F\u9A8C\u8BC1\u8BB0\u5F55",
|
|
145
|
+
"description": "\u4EC5\u5728\u4E3B\u52A8\u521B\u5EFA\u4E86\u65B0\u7684\u8BA1\u5212\u7248\u672C\u3001\u9700\u8981\u91CD\u65B0\u5173\u8054\u672A\u53D8\u6D4B\u8BD5\u9879\u7684\u539F\u8BC1\u636E\u65F6\u4F7F\u7528\u3002\u539F\u8BA1\u5212\u65B0\u589E\u6D4B\u8BD5\u9879\u6216\u666E\u901A\u5C40\u90E8\u66F4\u65B0\u4F1A\u4FDD\u7559\u672A\u53D8\u9879\u7684\u7ED3\u679C\uFF0C\u4E0D\u9700\u8981\u8C03\u7528\u672C\u5DE5\u5177\u3002sourceVerificationId \u4ECE read_qa_results \u7684\u771F\u5B9E\u8BB0\u5F55\u9009\u62E9\uFF0C\u53EA\u80FD\u590D\u7528\u540C\u8F6E\u3001\u540C\u73AF\u5883\u4E14\u6D4B\u8BD5\u8981\u6C42\u672A\u53D8\u7684\u5B9E\u6D4B\uFF1B\u8981\u6C42\u590D\u9A8C\u7684\u9879\u76EE\u5FC5\u987B\u91CD\u65B0\u6D4B\u8BD5\u3002\u4FDD\u7559\u539F\u7ED3\u679C\u3001\u622A\u56FE\u4E0E\u9A8C\u8BC1\u65F6\u95F4\uFF0C\u4E0D\u7B97\u4E00\u6B21\u65B0\u6D4B\u8BD5\u3002\u53EA\u586B\u5199\u5F53\u524D testItemIds \u548C\u9009\u4E2D\u8BB0\u5F55\u7684 sourceVerificationId\u3002",
|
|
146
|
+
"execution": "HOST",
|
|
147
|
+
"handler": "reuse_qa_verification",
|
|
148
|
+
"parameters": {
|
|
149
|
+
"type": "object",
|
|
150
|
+
"additionalProperties": false,
|
|
151
|
+
"properties": {
|
|
152
|
+
"testItemIds": {
|
|
153
|
+
"type": "array",
|
|
154
|
+
"minItems": 1,
|
|
155
|
+
"uniqueItems": true,
|
|
156
|
+
"items": {
|
|
157
|
+
"type": "string",
|
|
158
|
+
"minLength": 1,
|
|
159
|
+
"pattern": "\\S"
|
|
160
|
+
},
|
|
161
|
+
"description": "read_qa_test_plan \u8FD4\u56DE\u7684\u5F53\u524D\u6D4B\u8BD5\u9879\u7F16\u53F7\uFF0C\u4F8B\u5982 TC-001\uFF1B\u4E0D\u586B\u5199\u6570\u636E\u5E93 UUID\u3002"
|
|
162
|
+
},
|
|
163
|
+
"sourceVerificationId": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"format": "uuid",
|
|
166
|
+
"description": "\u4ECE read_qa_results \u8FD4\u56DE\u7684\u672C\u8F6E\u771F\u5B9E\u5B9E\u6D4B\u8BB0\u5F55\u9009\u62E9\u5176 ID\uFF0C\u4E0D\u5F97\u731C\u9020\u3002"
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
"required": [
|
|
170
|
+
"testItemIds",
|
|
171
|
+
"sourceVerificationId"
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"name": "request_qa_waiver",
|
|
177
|
+
"label": "\u7533\u8BF7\u6D4B\u8BD5\u9879\u8C41\u514D",
|
|
178
|
+
"description": '\u4E3A\u65E0\u6CD5\u5408\u7406\u6267\u884C\u7684\u6D4B\u8BD5\u9879\u8BB0\u5F55\u8C41\u514D\u7533\u8BF7\u53CA\u98CE\u9669\uFF0C\u7533\u8BF7\u4E0D\u7B49\u4E8E\u6279\u51C6\uFF0C\u4E0D\u8BA1\u901A\u8FC7\uFF0C\u4E5F\u4E0D\u6682\u505C\u5176\u4ED6\u6D4B\u8BD5\u3002\u65E0\u9700\u865A\u6784\u6B65\u9AA4\u3001\u5B9E\u6D4B\u7ED3\u679C\u6216\u622A\u56FE\uFF1B\u6700\u7EC8\u7531\u7528\u6237\u51B3\u5B9A\u662F\u5426\u63A5\u53D7\u98CE\u9669\u3002\u793A\u4F8B\uFF1A{"testItemIds":["TC-003"],"waiverReason":"\u5F53\u524D\u73AF\u5883\u65E0\u6CD5\u51C6\u5907\u6240\u9700\u6570\u636E\u89C4\u6A21","waiverRisk":"\u5C1A\u672A\u9A8C\u8BC1\u76EE\u6807\u89C4\u6A21\u4E0B\u7684\u6027\u80FD","waiverScope":"TC-003 \u5927\u89C4\u6A21\u538B\u529B\u6D4B\u8BD5"}\u3002',
|
|
179
|
+
"execution": "HOST",
|
|
180
|
+
"handler": "request_qa_waiver",
|
|
181
|
+
"parameters": {
|
|
182
|
+
"type": "object",
|
|
183
|
+
"additionalProperties": false,
|
|
184
|
+
"properties": {
|
|
185
|
+
"testItemIds": {
|
|
186
|
+
"type": "array",
|
|
187
|
+
"minItems": 1,
|
|
188
|
+
"uniqueItems": true,
|
|
189
|
+
"items": {
|
|
190
|
+
"type": "string",
|
|
191
|
+
"minLength": 1,
|
|
192
|
+
"pattern": "\\S"
|
|
193
|
+
},
|
|
194
|
+
"description": "read_qa_test_plan \u8FD4\u56DE\u7684\u5F53\u524D\u6D4B\u8BD5\u9879\u7F16\u53F7\uFF0C\u4F8B\u5982 TC-001\uFF1B\u4E0D\u586B\u5199\u6570\u636E\u5E93 UUID\u3002"
|
|
195
|
+
},
|
|
196
|
+
"waiverReason": {
|
|
197
|
+
"type": "string",
|
|
198
|
+
"minLength": 1,
|
|
199
|
+
"maxLength": 2e4,
|
|
200
|
+
"pattern": "\\S",
|
|
201
|
+
"description": "\u4E3A\u4F55\u65E0\u6CD5\u5408\u7406\u6267\u884C\uFF0C\u5E94\u63CF\u8FF0\u771F\u5B9E\u539F\u56E0\u3002"
|
|
202
|
+
},
|
|
203
|
+
"waiverRisk": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"minLength": 1,
|
|
206
|
+
"maxLength": 2e4,
|
|
207
|
+
"pattern": "\\S",
|
|
208
|
+
"description": "\u672A\u9A8C\u8BC1\u5E26\u6765\u7684\u5B9E\u9645\u98CE\u9669\u3002"
|
|
209
|
+
},
|
|
210
|
+
"waiverScope": {
|
|
211
|
+
"type": "string",
|
|
212
|
+
"minLength": 1,
|
|
213
|
+
"maxLength": 2e4,
|
|
214
|
+
"pattern": "\\S",
|
|
215
|
+
"description": "\u7533\u8BF7\u8C41\u514D\u7684\u5177\u4F53\u6D4B\u8BD5\u8981\u6C42\u548C\u5F71\u54CD\u8303\u56F4\u3002"
|
|
216
|
+
},
|
|
217
|
+
"content": {
|
|
218
|
+
"type": "string",
|
|
219
|
+
"minLength": 1,
|
|
220
|
+
"maxLength": 2e4,
|
|
221
|
+
"pattern": "\\S",
|
|
222
|
+
"description": "\u53EF\u9009\u7684\u4E00\u53E5\u8BDD\u6458\u8981\uFF1B\u4E0D\u586B\u65F6\u5C55\u793A\u7533\u8BF7\u7406\u7531\u3002"
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
"required": [
|
|
226
|
+
"testItemIds",
|
|
227
|
+
"waiverReason",
|
|
228
|
+
"waiverRisk",
|
|
229
|
+
"waiverScope"
|
|
230
|
+
]
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
];
|
|
234
|
+
|
|
235
|
+
// ../../packages/api-contracts/src/qa-tool-arguments.ts
|
|
236
|
+
var names = new Set(QA_VERIFICATION_TOOL_DEFINITIONS.map((tool) => tool.name));
|
|
237
|
+
var ajv = new Ajv({
|
|
238
|
+
allErrors: true,
|
|
239
|
+
strict: false,
|
|
240
|
+
coerceTypes: false,
|
|
241
|
+
removeAdditional: false
|
|
242
|
+
});
|
|
243
|
+
addFormats.default(ajv);
|
|
244
|
+
function fieldPath(error) {
|
|
245
|
+
const parts = error.instancePath.split("/").filter(Boolean);
|
|
246
|
+
if (parts[0] === "requestBody") parts.shift();
|
|
247
|
+
const extra = error.params.missingProperty ?? error.params.additionalProperty;
|
|
248
|
+
if (typeof extra === "string") parts.push(extra);
|
|
249
|
+
return parts.reduce((path, part) => {
|
|
250
|
+
const safe = /^[a-zA-Z_$][\w$-]{0,63}$/.test(part) ? part : "\u672A\u77E5\u5B57\u6BB5";
|
|
251
|
+
return /^\d{1,6}$/.test(part) ? `${path}[${part}]` : `${path}${path ? "." : ""}${safe}`;
|
|
252
|
+
}, "") || "arguments";
|
|
253
|
+
}
|
|
254
|
+
function qaArgumentIssues(errors) {
|
|
255
|
+
return (errors ?? []).slice(0, 12).map((error) => {
|
|
256
|
+
const path = fieldPath(error);
|
|
257
|
+
switch (error.keyword) {
|
|
258
|
+
case "required":
|
|
259
|
+
return { path, reason: "\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5", suggestion: `\u8BF7\u586B\u5199 ${path}\u3002` };
|
|
260
|
+
case "additionalProperties":
|
|
261
|
+
return {
|
|
262
|
+
path,
|
|
263
|
+
reason: "\u4E0D\u652F\u6301\u6B64\u5B57\u6BB5",
|
|
264
|
+
suggestion: `\u8BF7\u5220\u9664 ${path}\uFF1B\u4EC5\u586B\u5199\u5DE5\u5177\u58F0\u660E\u7684\u5B57\u6BB5\u3002`
|
|
265
|
+
};
|
|
266
|
+
case "type": {
|
|
267
|
+
const type = { string: "\u5B57\u7B26\u4E32", array: "\u6570\u7EC4", object: "\u5BF9\u8C61", integer: "\u6574\u6570" }[error.params.type] ?? error.params.type;
|
|
268
|
+
return { path, reason: `\u7C7B\u578B\u5E94\u4E3A${type}`, suggestion: `\u8BF7\u5C06 ${path} \u586B\u5199\u4E3A${type}\u3002` };
|
|
269
|
+
}
|
|
270
|
+
case "enum":
|
|
271
|
+
return {
|
|
272
|
+
path,
|
|
273
|
+
reason: "\u4E0D\u5728\u5141\u8BB8\u7684\u9009\u9879\u4E2D",
|
|
274
|
+
suggestion: `\u8BF7\u4F7F\u7528\uFF1A${error.params.allowedValues.join("\u3001")}\u3002`
|
|
275
|
+
};
|
|
276
|
+
case "format":
|
|
277
|
+
return {
|
|
278
|
+
path,
|
|
279
|
+
reason: "\u8BB0\u5F55 ID \u683C\u5F0F\u4E0D\u6B63\u786E",
|
|
280
|
+
suggestion: "\u8BF7\u4ECE read_qa_results \u8FD4\u56DE\u7684\u771F\u5B9E\u9A8C\u8BC1\u8BB0\u5F55\u4E2D\u9009\u62E9 ID\uFF0C\u4E0D\u8981\u586B\u5199\u6587\u4EF6\u540D\u6216\u731C\u9020 ID\u3002"
|
|
281
|
+
};
|
|
282
|
+
case "minLength":
|
|
283
|
+
case "pattern":
|
|
284
|
+
return { path, reason: "\u4E0D\u80FD\u4E3A\u7A7A\u6216\u4EC5\u542B\u7A7A\u767D", suggestion: `\u8BF7\u4E3A ${path} \u586B\u5199\u771F\u5B9E\u5185\u5BB9\u3002` };
|
|
285
|
+
case "maxLength":
|
|
286
|
+
return {
|
|
287
|
+
path,
|
|
288
|
+
reason: "\u5185\u5BB9\u8FC7\u957F",
|
|
289
|
+
suggestion: `\u8BF7\u5C06 ${path} \u7F29\u77ED\u81F3 ${error.params.limit} \u4E2A\u5B57\u7B26\u4EE5\u5185\u3002`
|
|
290
|
+
};
|
|
291
|
+
case "minItems":
|
|
292
|
+
return {
|
|
293
|
+
path,
|
|
294
|
+
reason: "\u9879\u76EE\u6570\u91CF\u4E0D\u8DB3",
|
|
295
|
+
suggestion: `\u8BF7\u4E3A ${path} \u63D0\u4F9B\u81F3\u5C11 ${error.params.limit} \u9879\u3002`
|
|
296
|
+
};
|
|
297
|
+
case "maxItems":
|
|
298
|
+
return {
|
|
299
|
+
path,
|
|
300
|
+
reason: "\u9879\u76EE\u6570\u91CF\u8D85\u8FC7\u9650\u5236",
|
|
301
|
+
suggestion: `\u8BF7\u5C06 ${path} \u51CF\u5C11\u81F3\u6700\u591A ${error.params.limit} \u9879\u3002`
|
|
302
|
+
};
|
|
303
|
+
case "uniqueItems":
|
|
304
|
+
return { path, reason: "\u5B58\u5728\u91CD\u590D\u9879", suggestion: `\u8BF7\u5220\u9664 ${path} \u4E2D\u7684\u91CD\u590D\u9879\u3002` };
|
|
305
|
+
default:
|
|
306
|
+
return { path, reason: "\u5B57\u6BB5\u4E0D\u7B26\u5408\u8981\u6C42", suggestion: "\u8BF7\u6309\u5F53\u524D\u5DE5\u5177\u7684\u5B57\u6BB5\u8BF4\u660E\u548C\u793A\u4F8B\u4FEE\u6B63\u3002" };
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
function qaArgumentError(issues) {
|
|
311
|
+
return JSON.stringify({ code: "INPUT_INVALID", errors: issues });
|
|
312
|
+
}
|
|
313
|
+
function prepareQaToolArguments(name, schema) {
|
|
314
|
+
if (!names.has(name)) return void 0;
|
|
315
|
+
const validate = ajv.compile(schema);
|
|
316
|
+
return (args) => {
|
|
317
|
+
if (!validate(args)) throw new Error(qaArgumentError(qaArgumentIssues(validate.errors)));
|
|
318
|
+
const value = args;
|
|
319
|
+
if (name === "submit_qa_verification" && value.conclusion === "UNVERIFIABLE" && !value.unverifiableReason?.trim())
|
|
320
|
+
throw new Error(
|
|
321
|
+
qaArgumentError([
|
|
322
|
+
{
|
|
323
|
+
path: "unverifiableReason",
|
|
324
|
+
reason: "\u65E0\u6CD5\u9A8C\u8BC1\u65F6\u5FC5\u987B\u8BF4\u660E\u539F\u56E0",
|
|
325
|
+
suggestion: "\u8BF7\u586B\u5199\u771F\u5B9E\u7684\u65E0\u6CD5\u9A8C\u8BC1\u539F\u56E0\u3002"
|
|
326
|
+
}
|
|
327
|
+
])
|
|
328
|
+
);
|
|
329
|
+
return value;
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
export {
|
|
333
|
+
prepareQaToolArguments,
|
|
334
|
+
qaArgumentError,
|
|
335
|
+
qaArgumentIssues
|
|
336
|
+
};
|
package/dist/stage-delivery.js
CHANGED
|
@@ -27,6 +27,7 @@ export const STAGE_DELIVERY_PROTOCOLS = {
|
|
|
27
27
|
conditionalFiles: [],
|
|
28
28
|
instructions:
|
|
29
29
|
"开发交付必须提交 plan.md、code_review.md、report.md、release_checklist.md。plan.md 必须存在且内容非空,不校验格式、勾选状态或产出时机。report.md 是开发测试报告,必须填写实际正文,不能原样提交空模板;独立说明任务、实现范围、验证环境与结论,逐条列出 PRD 和适用 design.md 中的验收项,验收编号及来源与验收内容分列,写清场景、条件、操作和预期结果。汇报已验证项的实际结果,以及未验证项及原因;部分验证分别说明两部分,即使全部无法验证也如实逐项说明,不以代码已实现或 mock 通过冒充真实环境验证。主负责人汇总成员结果;不要求全部验收项在开发阶段验证通过,不要求安排后续验证。模板仅作填写指引,不校验固定格式或验收覆盖。调用 complete_development 前提交本轮改动并推送已分配开发分支;工具不代替 commit/push,不创建 MR。仅允许推送已分配开发分支,不推送基准、测试或生产分支,不强推。调用 complete_development({summary}) 后以后端结果为准;缺失文件按反馈补齐。" +
|
|
30
|
+
"summary 说明本轮变更与部署后需复测事项;平台携带采集的项目、开发分支与提交事实交接部署。" +
|
|
30
31
|
communication,
|
|
31
32
|
},
|
|
32
33
|
DEPLOYMENT: {
|
|
@@ -37,6 +38,7 @@ export const STAGE_DELIVERY_PROTOCOLS = {
|
|
|
37
38
|
conditionalFiles: [],
|
|
38
39
|
instructions:
|
|
39
40
|
"部署结果通过 summary 参数提交。工具从开发目录读取已有交付文件,调用 submit_delivery({summary,pipelineExecutions}),pipelineExecutions 必须逐一覆盖本次配置的所有流水线,包含项目名称、流水线ID、实际执行链接、SUCCESS或FAILED状态和执行说明;后端确认成功才算完成。缺失文件按工具反馈补齐重交,plan.md 必须有非空内容,不校验格式、勾选状态或产出时机,上传失败复用原批次重试。" +
|
|
41
|
+
"每个部署请求均需调用 submit_delivery;复用已有成功发布记录时说明本轮代码已合入且对应发布成功的核实依据,不能仅回复上一轮已完成。" +
|
|
40
42
|
communication +
|
|
41
43
|
testWorkspace,
|
|
42
44
|
},
|
|
@@ -47,8 +49,8 @@ export const STAGE_DELIVERY_PROTOCOLS = {
|
|
|
47
49
|
optionalFiles: [],
|
|
48
50
|
conditionalFiles: [],
|
|
49
51
|
instructions:
|
|
50
|
-
"使用 read_qa_test_plan 读取计划,create_qa_test_plan 明确创建首版或下一业务版本,update_qa_test_plan
|
|
51
|
-
"用户希望单项豁免时,指引其在「QA 验收 →
|
|
52
|
+
"使用 read_qa_test_plan 读取计划,create_qa_test_plan 明确创建首版或下一业务版本,update_qa_test_plan 局部更新同一版本并登记待复验范围,沿用平台返回的真实测试项编号。新版本不自动继承旧验证和人工豁免。当前计划的证据、豁免和报告可独立记录,无须先报告整轮就绪;某项缺条件不阻挡其他项。submit_qa_verification 只提交真实实测结果。原计划增补或局部更新会保留未变项结果,无需调用复用工具;仅在主动创建新计划版本后,可用 reuse_qa_verification 引用同轮旧版本中要求未变且未要求复验的实测记录,保留原附件与验证时间。request_qa_waiver 单独提交豁免申请;申请须有理由、影响范围和未覆盖风险,不等于人工批准。submit_qa_conclusion 随时保存阶段报告,按已知事实说明结果、未完成项和下一步;报告保存不代表验收通过。使用 report_qa_defects 记录缺陷、request_qa_rework 请求返工、resolve_qa_defect 提交复测结果。complete_qa_review 提交本轮结果,实际后续状态以平台结果为准;report_qa_asset_merge 仅在当前上线准备分配测试资产任务时登记 MR 准备结果。工具回执、执行证据与权限以平台真实结果为准,Agent 可自主申请但不自行批准豁免。" +
|
|
53
|
+
"用户希望单项豁免时,指引其在「QA 验收 → 验收工作台」选中对应测试项,点击「放行此项」,填写原因并确认;当前计划的各项均支持,无需先让 Agent 申请或等待特定状态。不用「放行并推进」代替单项放行,也不把会话中的口头豁免当作平台记录。用户确认后重新 read_qa_test_plan,以当前版本的 waiver 记录为准;保留原始执行结果,不将豁免计为测试通过,不删除或改写测试项。已放行项不再要求补齐仅供该项使用的前置条件,其余可执行项继续正常验证。" +
|
|
52
54
|
communication,
|
|
53
55
|
},
|
|
54
56
|
RELEASE: {
|
|
@@ -69,8 +71,8 @@ export const WORKFLOW_NODES = ["DEVELOPMENT", "DEPLOYMENT", "QA", "RELEASE"]
|
|
|
69
71
|
export const DEFAULT_STAGE_DELIVERY_PROMPTS = {
|
|
70
72
|
DEVELOPMENT: `${common}\n${developmentPlan}\n先阅读 PRD 和适用设计,按项目 AGENTS.md、CLAUDE.md 及其引用的 Skill 工作。仅实现 PRD 明确采用的范围。开发会话负责开发、自测与交付材料,不执行部署;普通咨询按用户范围处理,不自动扩张为旧阶段任务,只提交本轮任务内容,不夹带无关改动。`,
|
|
71
73
|
DEPLOYMENT:
|
|
72
|
-
"
|
|
73
|
-
QA: "先读取当前测试计划。没有计划时创建首版;已有计划时默认沿用,需要调整则优先局部更新。返修、重新部署、新 QA 轮次、个别测试失败、补充信息或豁免申请本身,都不构成创建新版本的理由。只有需要整体重新制定测试安排、局部更新不足以表达时,才创建下一版本,并说明为何需要重新制定以及重新建立验证结论的影响。新版本不会自动沿用原验证结果与人工豁免;不要通过创建新版本解决可在当前计划内处理的问题。按确认的 PRD/AC 设计测试并按变更风险补充边界、异常、安全、并发等适用项目,不机械套用全部类别。API/浏览器是操作方式,自动化/Agent/人工是执行方式。根据验收标准、变更风险、已有测试资产和验证成本,选择 Agent 验证、自动化测试或两者结合,并在测试计划中说明选择依据,不默认强制某一种。适合重复执行、稳定断言和回归覆盖的场景优先复用自动化;探索性验证、界面体验及需要现场判断的场景采用 Agent
|
|
74
|
+
"部署结果说明目标、分支、流水线、发布结果、入口、就绪检查及遗留问题,不以测试报告代替部署事实。复用会话中的经验,每次按当前部署请求和最新研发交接重新检查:fetch 远端,核对已推送开发分支与交接提交,完成向配置测试分支的合并、冲突适配、必要验证与 push。合并产生新内容必须发布;按配置执行或关联流水线,自动触发时关联实际执行记录,避免重复触发。没有新内容时仍须核实对应代码是否已有成功发布;已合入但未发布或发布失败则执行部署,已有对应成功发布则说明依据并复用记录。完成后为当前请求调用 submit_delivery,后端确认后交接后续阶段,不以历史成功结论结束本轮。直接使用配置测试分支,不创建中间集成分支;不将测试分支合回开发分支,不修改开发分支业务代码。先检查分支、未提交修改及未完成合并,保留并处理已有现场,不盲目 reset、clean 或重放 push。账号、环境、配置问题在当前会话沟通解决。测试侧冲突、适配及流水线问题由部署员工处理;确认开发分支自身存在缺陷才请求研发修复,提供位置、证据和原因。共享环境被其他发布更新时如实说明,不反复部署抢回版本。结果未知先核实,不伪造成功。",
|
|
75
|
+
QA: "先读取当前测试计划。没有计划时创建首版;已有计划时默认沿用,需要调整则优先局部更新。返修、重新部署、新 QA 轮次、个别测试失败、补充信息或豁免申请本身,都不构成创建新版本的理由。只有需要整体重新制定测试安排、局部更新不足以表达时,才创建下一版本,并说明为何需要重新制定以及重新建立验证结论的影响。新版本不会自动沿用原验证结果与人工豁免;不要通过创建新版本解决可在当前计划内处理的问题。按确认的 PRD/AC 设计测试并按变更风险补充边界、异常、安全、并发等适用项目,不机械套用全部类别。API/浏览器是操作方式,自动化/Agent/人工是执行方式。根据验收标准、变更风险、已有测试资产和验证成本,选择 Agent 验证、自动化测试或两者结合,并在测试计划中说明选择依据,不默认强制某一种。适合重复执行、稳定断言和回归覆盖的场景优先复用自动化;探索性验证、界面体验及需要现场判断的场景采用 Agent 验证;需要互补覆盖时结合使用,避免无价值的重复验证。用户明确指定测试方式时遵循其要求,覆盖不足时说明缺口。对所有测试项评估可行性:能测且就绪则实测;已有适用证据可沿用;不可行或准备成本明显不相称(例如千万级数据)可自主申请豁免,说明依据、影响范围及风险,不须预先取得授权,不因申请暂停其余测试。缺少环境、账号、权限或数据时说明受影响 TC 和缺口,可询问用户补充;其他可处理项仍可继续。已有真实结果可随时提交,不要求先执行环境检查或等待其他项;不虚构执行结果,不静默缩减范围。按已配置共享测试环境验证,不核对部署版本或 SHA,不因其他应用发布暂停;测试不通过则记录缺陷并请求返工。纯 Agent 不要求测试项目、测试仓库或 doctor,直接提交真实结果与证据,不要求另建自动化执行或逐项人工补证。测试代码与环境问题在 QA 处理,业务源码作为只读参考,产品缺陷交研发。复测取得证据后关闭对应缺陷。控台检查使用浏览器,保存真实截图和检查点。仅在涉及自动化测试资产时维护测试仓库,遵守仓库 contract 与 support/cases/flows 规范,并准备相应环境直至 doctor 通过。按需查询真实测试结果,不无意义轮询。平台通知合入时汇报真实结果,资产合并冲突自行解决并验证,业务语义不明时请求人工决策,不强推或绕过分支保护。完成 QA 与流程推进以平台实际回执和当前节点为准,不将沟通或报告保存视为流程推进。QA 测试及其完成、返工工具仅用于当前 QA 节点;进入后续节点后历史会话只读,需要继续测试应由人先返回 QA。上线准备可向原 QA 会话明确分配测试资产准备任务,此时只处理指定测试项目,通过 report_qa_asset_merge 准备并登记 MR,不重启 QA 测试,不调用 QA 完成或返工工具。返修后根据真实影响选择复测项,执行前通过 update_qa_test_plan 的 retestItemIds 登记;未受影响且仍适用的证据沿用原轮次与时间,不重复上传。实质修改测试要求后复验受影响项并提交人工验收,不扩张原豁免范围。报告可随时保存,未完成项按事实展示;报告保存不代表测试通过或人工验收通过。人工验收由经办人确认,不以 QA 验证项或状态作为前置门禁;测试资产准备属于上线准备的可选范围:只有收到该节点分配的任务才处理原测试项目;MR 创建、合并和实际上线分别记录。未执行 QA、没有资产或未选择时不补配、不补跑;准备失败留在上线准备处理,不撤销验收、不返回 QA。",
|
|
74
76
|
RELEASE: `${common}\n读取最新代码、上线清单和适用设计及已验收部署结果。以设计为预期、代码核实,没有设计时从代码提取;无法证明的环境事实标待核实,不涉及说明原因。核实清单后提交文档改动,准备 MR 标题说明,标题包含工单编号与本项目变更摘要。说明任务目的、本项目改动、测试验收、发布注意、跨项目依赖、风险回滚及材料入口。测试部署记录不能代替上线清单。缺口需要用户补充时说明具体问题,不宣称核实完成。仅讨论和文档更新不退回开发。`,
|
|
75
77
|
};
|
|
76
78
|
export function developmentTeamMemberEntries(members
|
package/dist/state.d.ts
CHANGED
|
@@ -18,8 +18,8 @@ export interface HostState {
|
|
|
18
18
|
runtimeVersion: string;
|
|
19
19
|
catalogRevision: number;
|
|
20
20
|
}
|
|
21
|
-
export declare const CLI_VERSION = "0.0.
|
|
22
|
-
export declare const RUNTIME_VERSION = "0.0.
|
|
21
|
+
export declare const CLI_VERSION = "0.0.32";
|
|
22
|
+
export declare const RUNTIME_VERSION = "0.0.32";
|
|
23
23
|
export declare function hostIdentity(): {
|
|
24
24
|
fingerprint: string;
|
|
25
25
|
hostName: string;
|
package/dist/state.js
CHANGED
|
@@ -4,8 +4,8 @@ import { paths } from "./paths.js";
|
|
|
4
4
|
import { runtimeArchitecture } from "./platform.js";
|
|
5
5
|
import { bindPlatform } from "./profile.js";
|
|
6
6
|
import { readJson, writeSecureJson } from "./secure-json.js";
|
|
7
|
-
export const CLI_VERSION = "0.0.
|
|
8
|
-
export const RUNTIME_VERSION = "0.0.
|
|
7
|
+
export const CLI_VERSION = "0.0.32";
|
|
8
|
+
export const RUNTIME_VERSION = "0.0.32";
|
|
9
9
|
export function hostIdentity() {
|
|
10
10
|
const hostName = hostname();
|
|
11
11
|
return {
|
package/dist/test-cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-cli.d.ts","sourceRoot":"","sources":["../src/test-cli.ts"],"names":[],"mappings":"AAOA,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"test-cli.d.ts","sourceRoot":"","sources":["../src/test-cli.ts"],"names":[],"mappings":"AAOA,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,iBA8CvE"}
|
package/dist/test-cli.js
CHANGED
|
@@ -6,7 +6,7 @@ import { parseQaContract } from "./qa-contract.js";
|
|
|
6
6
|
import { executeQa, executeQaStage, gitQa, qaProcessEnvironment } from "./test-executor.js";
|
|
7
7
|
export async function testCli(action, args) {
|
|
8
8
|
if (!["run", "collect", "check", "doctor"].includes(action ?? ""))
|
|
9
|
-
throw new Error(`用法:${aipCommand()} test run|collect|check|doctor --environment NAME [--repository PATH] [--branch BRANCH --
|
|
9
|
+
throw new Error(`用法:${aipCommand()} test run|collect|check|doctor --environment NAME [--repository PATH] [--branch BRANCH --cases IDS --domains DOMAINS]`);
|
|
10
10
|
const option = (name) => {
|
|
11
11
|
const index = args.indexOf(name);
|
|
12
12
|
return index < 0 ? undefined : args[index + 1];
|
|
@@ -17,7 +17,6 @@ export async function testCli(action, args) {
|
|
|
17
17
|
throw new Error("QA_ENVIRONMENT_REQUIRED");
|
|
18
18
|
const executionId = randomUUID();
|
|
19
19
|
const branch = option("--branch") ?? (await gitQa(["branch", "--show-current"], cwd));
|
|
20
|
-
const commitSha = option("--commit") ?? (await gitQa(["rev-parse", "HEAD"], cwd));
|
|
21
20
|
const input = {
|
|
22
21
|
executionId,
|
|
23
22
|
environment,
|
|
@@ -25,7 +24,6 @@ export async function testCli(action, args) {
|
|
|
25
24
|
id: "cli",
|
|
26
25
|
name: "cli",
|
|
27
26
|
branch,
|
|
28
|
-
commitSha,
|
|
29
27
|
remoteUrl: await gitQa(["remote", "get-url", "origin"], cwd),
|
|
30
28
|
},
|
|
31
29
|
selection: {
|
package/dist/test-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-cli.js","sourceRoot":"","sources":["../src/test-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE5F,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAA0B,EAAE,IAAc;IACtE,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CACb,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"test-cli.js","sourceRoot":"","sources":["../src/test-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/test-executor.d.ts
CHANGED
|
@@ -27,14 +27,14 @@ export declare function executeQaCatalog(input: Pick<QaExecutionInput, "project"
|
|
|
27
27
|
catalogId: string;
|
|
28
28
|
environmentVariables?: Record<string, string> | undefined;
|
|
29
29
|
}): Promise<{
|
|
30
|
-
commitSha: string;
|
|
30
|
+
commitSha: string | null;
|
|
31
31
|
manifest: QaManifest | null;
|
|
32
32
|
commands: QaCommandFact[];
|
|
33
33
|
environments: string[];
|
|
34
34
|
groups: import("@ai-platform/api-contracts").QaTestGroup[];
|
|
35
35
|
error?: string;
|
|
36
36
|
} | {
|
|
37
|
-
commitSha:
|
|
37
|
+
commitSha: null;
|
|
38
38
|
manifest: null;
|
|
39
39
|
commands: never[];
|
|
40
40
|
environments: never[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-executor.d.ts","sourceRoot":"","sources":["../src/test-executor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACX,MAAM,4BAA4B,CAAC;AAgBpC,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGjD,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,oBAAoB,EACpB,aAAa,GAAG,SAAS,GAAG,iBAAiB,GAAG,eAAe,GAAG,WAAW,CAC9E,GAAG;IACF,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC3D,CAAC;AACF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAKD,eAAO,MAAM,oBAAoB,GAAI,IAAI,MAAM,WACW,CAAC;AAC3D,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,WAC0B,CAAC;AAoBlE,4CAA4C;AAC5C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CA+B/F;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,SAAS,SAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA6CxB;AA+CD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,iBAAiB,CAAC,CAO5B;AAOD,wBAAsB,SAAS,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAMnF;
|
|
1
|
+
{"version":3,"file":"test-executor.d.ts","sourceRoot":"","sources":["../src/test-executor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACX,MAAM,4BAA4B,CAAC;AAgBpC,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGjD,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,oBAAoB,EACpB,aAAa,GAAG,SAAS,GAAG,iBAAiB,GAAG,eAAe,GAAG,WAAW,CAC9E,GAAG;IACF,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC3D,CAAC;AACF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAKD,eAAO,MAAM,oBAAoB,GAAI,IAAI,MAAM,WACW,CAAC;AAC3D,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,WAC0B,CAAC;AAoBlE,4CAA4C;AAC5C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CA+B/F;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,SAAS,SAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA6CxB;AA+CD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,iBAAiB,CAAC,CAO5B;AAOD,wBAAsB,SAAS,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAMnF;AAmPD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,kIAQ3C;AAED,4BAA4B;AAC5B,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC3D;eAkBY,MAAM,GAAG,IAAI;cACd,UAAU,GAAG,IAAI;cACjB,aAAa,EAAE;kBACX,MAAM,EAAE;YACd,OAAO,4BAA4B,EAAE,WAAW,EAAE;YAClD,MAAM;;;;;;;;GAbjB"}
|
package/dist/test-executor.js
CHANGED
|
@@ -142,7 +142,7 @@ async function toolVersions(input) {
|
|
|
142
142
|
async function initialQaResult(input) {
|
|
143
143
|
return {
|
|
144
144
|
runId: input.executionId,
|
|
145
|
-
commitSha:
|
|
145
|
+
commitSha: null,
|
|
146
146
|
branch: input.project.branch,
|
|
147
147
|
environment: input.environment ?? "",
|
|
148
148
|
deploymentRef: input.deploymentRef ?? null,
|
|
@@ -197,15 +197,18 @@ async function executeQaLocked(input) {
|
|
|
197
197
|
try {
|
|
198
198
|
await mkdir(join(paths().workspaceRoot, "qa-executions"), { recursive: true, mode: 0o700 });
|
|
199
199
|
await mkdir(qaExecutionDirectory(input.executionId), { recursive: false, mode: 0o700 });
|
|
200
|
-
|
|
200
|
+
const prepared = await prepareQaCheckout(input);
|
|
201
|
+
checkout = prepared.directory;
|
|
202
|
+
result.commitSha = prepared.commitSha;
|
|
203
|
+
const actual = { project: { ...input.project, commitSha: prepared.commitSha } };
|
|
201
204
|
const contract = parseQaContract(JSON.parse((await readQaFile(checkout, "contract.json")).toString("utf8")));
|
|
202
205
|
output = join(checkout, "target", "aip");
|
|
203
206
|
await mkdir(output, { recursive: true, mode: 0o700 });
|
|
204
207
|
await mkdir(join(checkout, ".aip"), { recursive: true, mode: 0o700 });
|
|
205
208
|
await writeSecureJson(join(checkout, ".aip", "selection.json"), result.selection);
|
|
206
|
-
const manifest = input.catalogManifest
|
|
209
|
+
const manifest = input.catalogManifest && input.project.commitSha === prepared.commitSha
|
|
207
210
|
? parseQaManifest(input.catalogManifest)
|
|
208
|
-
: await cachedManifest(
|
|
211
|
+
: await cachedManifest(actual);
|
|
209
212
|
if (manifest) {
|
|
210
213
|
result.manifest = manifest;
|
|
211
214
|
await writeSecureJson(join(checkout, "manifest.json"), manifest);
|
|
@@ -245,7 +248,7 @@ async function executeQaLocked(input) {
|
|
|
245
248
|
if (stage === "collect" && fact.exitCode === 0)
|
|
246
249
|
result.manifest = parseQaManifest(JSON.parse((await readQaFile(checkout, "manifest.json")).toString("utf8")));
|
|
247
250
|
if (stage === "collect" && fact.exitCode === 0 && !fact.timedOut && result.manifest)
|
|
248
|
-
await saveManifest(
|
|
251
|
+
await saveManifest(actual, result.manifest);
|
|
249
252
|
if ((fact.exitCode !== 0 || fact.timedOut) && stage !== "run") {
|
|
250
253
|
result.status =
|
|
251
254
|
fact.timedOut || fact.exitCode === null
|
|
@@ -429,7 +432,7 @@ export function qaMediaType(filename) {
|
|
|
429
432
|
/** 目录采集不检查被测环境,也不执行业务测试。 */
|
|
430
433
|
export async function executeQaCatalog(input) {
|
|
431
434
|
return withQaProject(input.project, () => executeQaCatalogLocked(input)).catch((error) => ({
|
|
432
|
-
commitSha:
|
|
435
|
+
commitSha: null,
|
|
433
436
|
manifest: null,
|
|
434
437
|
commands: [],
|
|
435
438
|
environments: [],
|
|
@@ -439,7 +442,7 @@ export async function executeQaCatalog(input) {
|
|
|
439
442
|
}
|
|
440
443
|
async function executeQaCatalogLocked(input) {
|
|
441
444
|
const result = {
|
|
442
|
-
commitSha:
|
|
445
|
+
commitSha: null,
|
|
443
446
|
manifest: null,
|
|
444
447
|
commands: [],
|
|
445
448
|
environments: [],
|
|
@@ -452,7 +455,9 @@ async function executeQaCatalogLocked(input) {
|
|
|
452
455
|
executionId: `catalog_${input.catalogId}`,
|
|
453
456
|
environmentVariables: input.environmentVariables,
|
|
454
457
|
};
|
|
455
|
-
const
|
|
458
|
+
const prepared = await prepareQaCheckout(execution);
|
|
459
|
+
const checkout = prepared.directory;
|
|
460
|
+
result.commitSha = prepared.commitSha;
|
|
456
461
|
const contract = parseQaContract(JSON.parse((await readQaFile(checkout, "contract.json")).toString("utf8")));
|
|
457
462
|
result.groups = contract.groups;
|
|
458
463
|
result.environments = [...new Set(contract.groups.flatMap((g) => g.environments))];
|
|
@@ -464,7 +469,7 @@ async function executeQaCatalogLocked(input) {
|
|
|
464
469
|
throw new Error(`用例目录采集失败${fact.timedOut ? "(超时)" : ""}:${fact.output || "命令无输出,请检查 Host 执行环境"}`);
|
|
465
470
|
result.manifest = parseQaManifest(JSON.parse((await readQaFile(checkout, "manifest.json")).toString("utf8")));
|
|
466
471
|
validateTestCatalog(contract.groups, result.manifest);
|
|
467
|
-
await saveManifest(input, result.manifest);
|
|
472
|
+
await saveManifest({ project: { ...input.project, commitSha: prepared.commitSha } }, result.manifest);
|
|
468
473
|
}
|
|
469
474
|
catch (error) {
|
|
470
475
|
result.error = error instanceof Error ? error.message : String(error);
|