@xqyz/xq-cli 0.3.18 → 0.3.20
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/CHANGELOG.md +21 -0
- package/package.json +1 -1
- package/src/cli.mjs +25 -2
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,27 @@
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [xq-cli 0.3.20 / WorkBuddy Plugin 0.10.39 / SkillHub 1.0.20] - 2026-09-02(npm 发布准备,SkillHub 不变)
|
|
14
|
+
|
|
15
|
+
### 供应方式并发回写根因修复
|
|
16
|
+
|
|
17
|
+
- 根据生产完整链路日志定位到后端多个异步解析线程使用旧快照覆盖用户已提交的 `bidderIdentity` 状态;修复采用持久化 `bidderRole` 标记和带条件的原子降级写入,避免依赖单机 `synchronized` 或轮询时序。
|
|
18
|
+
- `savebidderRole` 现在一次写入用户选择、顶层兼容状态和嵌套状态;晚到解析结果仍可更新其他字段,但无权把已确认供应方式从 `1` 回滚到 `0`。
|
|
19
|
+
- xq-cli 在显式收到已提交的 `--bidder-role` 后继续同一任务时,会忽略该字段的旧解析快照;WorkBuddy 同步携带选择并保留回归诊断,不再重新展示供应方式卡。
|
|
20
|
+
- 新增后端并发写保护、供应方式持久化、CLI 旧状态容错和 WorkBuddy 续跑参数回归测试。
|
|
21
|
+
- SkillHub 指令与交互协议未改变,继续使用 `1.0.20`,不生成或自动上传新版本。
|
|
22
|
+
|
|
23
|
+
## [xq-cli 0.3.19 / WorkBuddy Plugin 0.10.38 / SkillHub 1.0.20] - 2026-09-02(npm 已发布,SkillHub 待手动上传)
|
|
24
|
+
|
|
25
|
+
### 供应方式提交闭环与诊断
|
|
26
|
+
|
|
27
|
+
- `xq-cli bidder-role` 输出并保留 `/proxy/savebidderRole` 的请求时间、参数和原始响应,便于区分接口失败与业务状态未生效。
|
|
28
|
+
- WorkBuddy 将“选择已接收”“接口返回成功”“后台权威状态已生效”拆为三个阶段;只有 `bidderIdentity_judgement` 不再为 `0` 后才继续大纲。
|
|
29
|
+
- 接口返回成功但状态在限定窗口内未改变时,以 `BIDDER_ROLE_NOT_APPLIED` 阻塞并保留完整诊断;提交进程异常退出则返回 `BIDDER_ROLE_SUBMIT_RESULT_UNKNOWN`,不自动重复提交。
|
|
30
|
+
- MCP App 不再提前显示“已提交并继续下一步”,改为提示正在提交后台并核验是否生效。
|
|
31
|
+
- Plugin 固定依赖 `@xqyz/xq-cli@0.3.19`,MCP/Connector 基线同步到 `0.10.38`;Plugin 的 `latest` 与 `workbuddy-stable` 均指向 `0.10.38`。
|
|
32
|
+
- 本机 WorkBuddy 已写入精确 Plugin `0.10.38` 并同步 Skill `1.0.20`,MCP 启动握手通过;SkillHub `1.0.20` 校验包已生成,仍由发布人手动上传。
|
|
33
|
+
|
|
13
34
|
## [xq-cli 0.3.18 / WorkBuddy Plugin 0.10.37 / SkillHub 1.0.19] - 2026-09-02(npm 已发布,SkillHub 待手动上传)
|
|
14
35
|
|
|
15
36
|
### 供应方式续跑与 EPC 语义修复
|
package/package.json
CHANGED
package/src/cli.mjs
CHANGED
|
@@ -1146,10 +1146,13 @@ async function handleBidderRole(args, state) {
|
|
|
1146
1146
|
if (![1, 2].includes(bidderRole)) {
|
|
1147
1147
|
throw new Error('Option --bidder-role expects 1 (self production) or 2 (procured supply).');
|
|
1148
1148
|
}
|
|
1149
|
+
const requestStartedAt = new Date().toISOString();
|
|
1150
|
+
const requestStartedMs = Date.now();
|
|
1149
1151
|
const response = await getJson(client, '/proxy/savebidderRole', {
|
|
1150
1152
|
uuid,
|
|
1151
1153
|
bidderRole,
|
|
1152
1154
|
});
|
|
1155
|
+
const requestCompletedAt = new Date().toISOString();
|
|
1153
1156
|
saveTaskSnapshot(state, cid, {
|
|
1154
1157
|
uuid,
|
|
1155
1158
|
bidderRole,
|
|
@@ -1160,6 +1163,14 @@ async function handleBidderRole(args, state) {
|
|
|
1160
1163
|
uuid,
|
|
1161
1164
|
bidderRole,
|
|
1162
1165
|
response,
|
|
1166
|
+
request: {
|
|
1167
|
+
method: 'GET',
|
|
1168
|
+
endpoint: '/proxy/savebidderRole',
|
|
1169
|
+
params: { uuid, bidderRole },
|
|
1170
|
+
startedAt: requestStartedAt,
|
|
1171
|
+
completedAt: requestCompletedAt,
|
|
1172
|
+
durationMs: Math.max(0, Date.now() - requestStartedMs),
|
|
1173
|
+
},
|
|
1163
1174
|
};
|
|
1164
1175
|
outputResult(args, payload, [
|
|
1165
1176
|
`bidder role saved: cid=${cid}`,
|
|
@@ -3336,7 +3347,7 @@ async function waitForOutlineReady(client, state, cid, uuid, args, initialSubmit
|
|
|
3336
3347
|
progressLabel: `unsupported_parse_state=${String(parseStatus.success)}`,
|
|
3337
3348
|
};
|
|
3338
3349
|
}
|
|
3339
|
-
const issues =
|
|
3350
|
+
const issues = collectContinuationParseIssues(parseStatus, args);
|
|
3340
3351
|
const unsupportedIssues = collectUnsupportedParseIssues(parseStatus);
|
|
3341
3352
|
|
|
3342
3353
|
if (parseSuccess === 4 && unsupportedIssues.length > 0) {
|
|
@@ -3550,7 +3561,7 @@ async function waitForPlanningAnalysisReady(client, state, cid, uuid, args) {
|
|
|
3550
3561
|
'[TASK_PARSE_NOT_ADVANCED] 规划模式仍处于等待标包/EPC选择(success=2),未进入解析阶段,已停止等待。',
|
|
3551
3562
|
);
|
|
3552
3563
|
}
|
|
3553
|
-
const issues =
|
|
3564
|
+
const issues = collectContinuationParseIssues(parseStatus, args);
|
|
3554
3565
|
const unsupportedIssues = collectUnsupportedParseIssues(parseStatus);
|
|
3555
3566
|
if (parseSuccess === 4 && unsupportedIssues.length > 0) {
|
|
3556
3567
|
return {
|
|
@@ -4226,6 +4237,18 @@ function collectParseIssues(result) {
|
|
|
4226
4237
|
});
|
|
4227
4238
|
}
|
|
4228
4239
|
|
|
4240
|
+
function collectContinuationParseIssues(result, args = {}) {
|
|
4241
|
+
const issues = collectParseIssues(result);
|
|
4242
|
+
const bidderRole = Number(args.bidderRole);
|
|
4243
|
+
if (![1, 2].includes(bidderRole)) {
|
|
4244
|
+
return issues;
|
|
4245
|
+
}
|
|
4246
|
+
// A bidder role reaches this command only after the dedicated submission
|
|
4247
|
+
// endpoint has accepted an explicit user selection. Concurrent parser
|
|
4248
|
+
// snapshots may still expose the old zero flag; do not reopen that gate.
|
|
4249
|
+
return issues.filter(issue => issue !== 'bidderIdentity_judgement');
|
|
4250
|
+
}
|
|
4251
|
+
|
|
4229
4252
|
function isFalsyStatus(value) {
|
|
4230
4253
|
if (value === false || value === 0) return true;
|
|
4231
4254
|
const normalized = String(value ?? '').trim().toLowerCase();
|