@xqyz/xq-cli 0.3.19 → 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 CHANGED
@@ -10,7 +10,17 @@
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
- ## [xq-cli 0.3.19 / WorkBuddy Plugin 0.10.38 / SkillHub 1.0.20] - 2026-09-02(发布准备中)
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 待手动上传)
14
24
 
15
25
  ### 供应方式提交闭环与诊断
16
26
 
@@ -18,7 +28,8 @@
18
28
  - WorkBuddy 将“选择已接收”“接口返回成功”“后台权威状态已生效”拆为三个阶段;只有 `bidderIdentity_judgement` 不再为 `0` 后才继续大纲。
19
29
  - 接口返回成功但状态在限定窗口内未改变时,以 `BIDDER_ROLE_NOT_APPLIED` 阻塞并保留完整诊断;提交进程异常退出则返回 `BIDDER_ROLE_SUBMIT_RESULT_UNKNOWN`,不自动重复提交。
20
30
  - MCP App 不再提前显示“已提交并继续下一步”,改为提示正在提交后台并核验是否生效。
21
- - Plugin 固定依赖 `@xqyz/xq-cli@0.3.19`,MCP/Connector 基线同步到 `0.10.38`;SkillHub `1.0.20` 仅生成待手动上传包。
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` 校验包已生成,仍由发布人手动上传。
22
33
 
23
34
  ## [xq-cli 0.3.18 / WorkBuddy Plugin 0.10.37 / SkillHub 1.0.19] - 2026-09-02(npm 已发布,SkillHub 待手动上传)
24
35
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xqyz/xq-cli",
3
- "version": "0.3.19",
3
+ "version": "0.3.20",
4
4
  "description": "CLI for xique bid-book task workflows",
5
5
  "type": "module",
6
6
  "scripts": {
package/src/cli.mjs CHANGED
@@ -3347,7 +3347,7 @@ async function waitForOutlineReady(client, state, cid, uuid, args, initialSubmit
3347
3347
  progressLabel: `unsupported_parse_state=${String(parseStatus.success)}`,
3348
3348
  };
3349
3349
  }
3350
- const issues = collectParseIssues(parseStatus);
3350
+ const issues = collectContinuationParseIssues(parseStatus, args);
3351
3351
  const unsupportedIssues = collectUnsupportedParseIssues(parseStatus);
3352
3352
 
3353
3353
  if (parseSuccess === 4 && unsupportedIssues.length > 0) {
@@ -3561,7 +3561,7 @@ async function waitForPlanningAnalysisReady(client, state, cid, uuid, args) {
3561
3561
  '[TASK_PARSE_NOT_ADVANCED] 规划模式仍处于等待标包/EPC选择(success=2),未进入解析阶段,已停止等待。',
3562
3562
  );
3563
3563
  }
3564
- const issues = collectParseIssues(parseStatus);
3564
+ const issues = collectContinuationParseIssues(parseStatus, args);
3565
3565
  const unsupportedIssues = collectUnsupportedParseIssues(parseStatus);
3566
3566
  if (parseSuccess === 4 && unsupportedIssues.length > 0) {
3567
3567
  return {
@@ -4237,6 +4237,18 @@ function collectParseIssues(result) {
4237
4237
  });
4238
4238
  }
4239
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
+
4240
4252
  function isFalsyStatus(value) {
4241
4253
  if (value === false || value === 0) return true;
4242
4254
  const normalized = String(value ?? '').trim().toLowerCase();