@xqyz/xq-cli 0.3.10 → 0.3.12

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,54 @@
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
- (暂无未发布变更)
13
+ ### 供应方式确认恢复
14
+
15
+ - 修复解析完成但 `bidderIdentity_judgement=0` 时 WorkBuddy 直接阻塞的问题,新增“我们自己生产 / 我们采购供应”选择卡。
16
+ - 供应方式提交后沿用同一 `runId/cid/uuid` 继续生成,兼容旧版本已标记为 `blocked` 的历史任务,并防止重复提交。
17
+ - 同步 CLI `bidder-role` 命令、MCP App、Hook 白名单、Connector/Plugin Skill 和回归测试。
18
+ - 计划发布 `@xqyz/xq-cli@0.3.12`、`@xqyz/workbuddy-plugin-xique@0.10.30`,生成 SkillHub `1.0.12` 上传包(待发布人手动上传)。
19
+
20
+ ## [WorkBuddy Plugin 0.10.29] - 2026-08-27
21
+
22
+ ### 模板5表格顺序
23
+
24
+ - 保持模板5紧凑编号表格位于“导出模板”之后,避免展开“导出格式设置”时顺序错乱。
25
+ - `@xqyz/workbuddy-plugin-xique@0.10.29` 已发布,`latest` 和 `workbuddy-stable` 均已指向该版本;SkillHub 无需新增版本。
26
+
27
+ ## [WorkBuddy Plugin 0.10.28] - 2026-08-27
28
+
29
+ ### 模板5自定义编号表格
30
+
31
+ - 修复模板5自定义编号在并入“导出格式设置”后误用通用单选卡的问题。
32
+ - 恢复标题级、正文级编号设置的紧凑表格下拉布局;数据结构和导出参数保持不变。
33
+ - `@xqyz/workbuddy-plugin-xique@0.10.28` 已发布,`latest` 和 `workbuddy-stable` 均已指向该版本;SkillHub 无需新增版本。
34
+
35
+ ## [xq-cli 0.3.11 / WorkBuddy Plugin 0.10.27 / SkillHub 1.0.11] - 2026-08-27
36
+
37
+ ### 写作质量与导出设置
38
+
39
+ - WorkBuddy 配置卡将“写作模式”改为“写作质量”,新增“旗舰智笔”,并保留旧参数兼容映射。
40
+ - 极短篇、超短篇按前端规则禁用专家智笔和旗舰智笔;图片来源选项保持直接展示。
41
+ - 表格、流程图、模板、编号、修改标记、页边距和图片尺寸等低频选项统一收纳到默认收起的“导出格式设置”。
42
+ - 同步 CLI、MCP App、Connector 和 Skill 文档,保持配置提交和规划流程不变。
43
+ - `@xqyz/xq-cli@0.3.11` 与 `@xqyz/workbuddy-plugin-xique@0.10.27` 已发布;`latest` 和 `workbuddy-stable` 均已指向对应版本。SkillHub `1.0.11` 上传包待手动上传。
44
+
45
+ ## [WorkBuddy Plugin 0.10.26 / SkillHub 1.0.10] - 2026-08-27
46
+
47
+ ### MCP 中文显示名
48
+
49
+ - WorkBuddy MCP 配置键统一写入“喜鹊标书”,安装器会将已有 `xique-bid` 配置迁移为中文键并保留原有运行参数。
50
+ - Connector 清单、安装提示和 MCP 初始化名称同步为“喜鹊标书”;Connector ID、工具命名空间和功能路径保持不变。
51
+ - `@xqyz/workbuddy-plugin-xique@0.10.26` 已发布,`latest` 与 `workbuddy-stable` 均指向该版本;SkillHub `1.0.10` 待手动上传。
52
+
53
+ ## [WorkBuddy Plugin 0.10.25 / SkillHub 1.0.9] - 2026-08-26
54
+
55
+ ### Plugin 发布
56
+
57
+ - WorkBuddy Plugin 固定依赖 `@xqyz/xq-cli@0.3.10`,MCP 运行时拒绝低于该版本的 CLI。
58
+ - MCP 初始化信息的用户可见名称为“喜鹊标书”,保留 `xique-bid` Connector ID、工具命名空间和功能路径不变。
59
+ - Windows 安装器的临时 npm 缓存改为异步清理,避免升级后残留句柄影响 WorkBuddy 重启。
60
+ - `@xqyz/workbuddy-plugin-xique@0.10.25` 已发布,`latest` 与 `workbuddy-stable` 均指向该版本;SkillHub `1.0.9` 上传包已生成,待手动上传。
14
61
 
15
62
  ## [WorkBuddy Plugin 0.10.24 / SkillHub 1.0.8] - 2026-08-26
16
63
 
package/README.md CHANGED
@@ -59,6 +59,7 @@ xq-cli login --browser
59
59
  xq-cli wizard
60
60
  xq-cli wizard --file D:\bids\tender.docx
61
61
  xq-cli init --file D:\bids\tender.docx --wait
62
+ xq-cli bidder-role --cid <cid> --uuid <uuid> --bidder-role <1|2>
62
63
  xq-cli outline --cid <cid> --interactive --wait
63
64
  xq-cli outline --cid <cid> --wait
64
65
  xq-cli outline view --cid <cid>
@@ -95,6 +96,11 @@ uploads an image in the Xique frontend.
95
96
 
96
97
  When `outline --wait` or `write --wait` hits a required response-basis step, the CLI will pause and ask you to choose `0/1/2` before continuing. It no longer auto-selects a default when you just press Enter.
97
98
 
99
+ For goods procurement tasks paused on the bidder supply method, use
100
+ `xq-cli bidder-role --cid <cid> --uuid <uuid> --bidder-role 1|2` (`1` means
101
+ self production, `2` means procured supply). The command only submits the
102
+ choice for the existing parsed task; it does not upload or create a task.
103
+
98
104
  `write --wait` now also retries `sequelForOutline` when the directory phase stalls at the outline-complete step, and auto-calls `generateAllUnfinished` if the backend reports `100%` but still leaves unfinished chapters behind.
99
105
 
100
106
  `write` follows the frontend flow:
@@ -184,7 +190,7 @@ The wizard will prompt for:
184
190
 
185
191
  - source bid file
186
192
  - article length
187
- - writing mode
193
+ - writing quality (standard writing / expert / flagship)
188
194
  - visual style
189
195
  - table quantity / color / style
190
196
  - planning mode
@@ -262,7 +268,7 @@ xq-cli choices export --json
262
268
  Outline generation now supports frontend-backed options such as:
263
269
 
264
270
  - `--page-scope` / `--page-scope-code`
265
- - `--base`
271
+ - `--writing-quality` (0=standard writing, 1=expert, 2=flagship; `--base` remains a compatibility alias)
266
272
  - `--theme-style`
267
273
  - `--table-quantity`
268
274
  - `--table-color`
@@ -291,7 +297,7 @@ Export now supports frontend-backed style options such as:
291
297
  Example outline config:
292
298
 
293
299
  ```bash
294
- xq-cli outline --cid <cid> --page-scope 3 --base expert --theme-style 4 --table-quantity rich --table-color blue --table-style zebra --mermaid-style blue --knowledge-img 1 --scene-img 1 --plan-mode quick --wait
300
+ xq-cli outline --cid <cid> --page-scope 3 --writing-quality flagship --theme-style 4 --table-quantity rich --table-color blue --table-style zebra --mermaid-style blue --knowledge-img 1 --scene-img 1 --plan-mode quick --wait
295
301
  ```
296
302
 
297
303
  Example export config:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xqyz/xq-cli",
3
- "version": "0.3.10",
3
+ "version": "0.3.12",
4
4
  "description": "CLI for xique bid-book task workflows",
5
5
  "type": "module",
6
6
  "scripts": {
package/src/cli.mjs CHANGED
@@ -183,6 +183,26 @@ const BASE_OPTIONS = [
183
183
  { value: '0', label: 'standard', description: 'standard writing', aliases: ['0', 'standard', 'default'] },
184
184
  { value: '1', label: 'expert', description: 'expert polish / public knowledge reference', aliases: ['1', 'expert', 'polish'] },
185
185
  ];
186
+ const WRITING_QUALITY_OPTIONS = [
187
+ {
188
+ value: 0,
189
+ label: 'standard-writing',
190
+ description: 'standard writing',
191
+ aliases: ['0', 'standard', 'standard-writing', '标准', '标准写作'],
192
+ },
193
+ {
194
+ value: 1,
195
+ label: 'expert',
196
+ description: 'expert writing',
197
+ aliases: ['1', 'expert', '专家智笔'],
198
+ },
199
+ {
200
+ value: 2,
201
+ label: 'flagship',
202
+ description: 'flagship deep-thinking writing',
203
+ aliases: ['2', 'flagship', '旗舰', '旗舰智笔'],
204
+ },
205
+ ];
186
206
  const THEME_STYLE_OPTIONS = [
187
207
  { value: 1, label: 'enhanced', description: 'enhanced image-rich layout', aliases: ['1', 'enhanced'] },
188
208
  { value: 2, label: 'table', description: 'table-first layout', aliases: ['2', 'table', 'table-first'] },
@@ -291,6 +311,7 @@ const PAGE_SCOPE_PROMPT_LABELS = {
291
311
  const BASE_PROMPT_LABELS = {
292
312
  0: '\u6807\u51C6\u5199\u4F5C',
293
313
  1: '\u4E13\u5BB6\u667A\u7B14',
314
+ 2: '\u65D7\u8230\u667A\u7B14',
294
315
  };
295
316
  const THEME_STYLE_PROMPT_LABELS = {
296
317
  1: '\u589E\u5F3A\u56FE\u6587',
@@ -377,6 +398,9 @@ async function main() {
377
398
  case 'period-confirm':
378
399
  await handlePeriodConfirm(parsed, state);
379
400
  return;
401
+ case 'bidder-role':
402
+ await handleBidderRole(parsed, state);
403
+ return;
380
404
  case 'outline':
381
405
  if (isOutlineAction(parsed, ['view', 'show'])) {
382
406
  await handleOutlineView(parsed, state);
@@ -446,6 +470,7 @@ Commands
446
470
  parse-status Query or wait for parse completion
447
471
  period-status Query engineering project period confirmation status
448
472
  period-confirm Save confirmed engineering project period
473
+ bidder-role Save the bidder's goods supply method for the current task
449
474
  outline Pre-set task params and trigger outline generation
450
475
  outline view View the current outline without triggering generation
451
476
  outline update Update the current outline from an edited JSON file
@@ -479,6 +504,7 @@ Examples
479
504
  $env:XQ_API_KEY="xq_sk_xxx"
480
505
  xq-cli init --file D:\\bids\\tender.docx --wait
481
506
  xq-cli parse-status --cid <cid> --uuid <uuid> --wait
507
+ xq-cli bidder-role --cid <cid> --uuid <uuid> --bidder-role <1|2>
482
508
  xq-cli choices
483
509
  xq-cli choices outline --json
484
510
  xq-cli gallery-status --json
@@ -490,7 +516,7 @@ Examples
490
516
  xq-cli outline --cid <cid> --wait --ignore-short-requirement
491
517
  xq-cli outline --cid <cid> --wait --ignore-missing-bill
492
518
  xq-cli outline --cid <cid> --wait --reference-type 0
493
- xq-cli outline --cid <cid> --page-scope 3 --base expert --theme-style 4 --table-quantity rich --plan-mode quick --wait
519
+ xq-cli outline --cid <cid> --page-scope 3 --writing-quality flagship --theme-style 4 --table-quantity rich --plan-mode quick --wait
494
520
  xq-cli outline view --cid <cid>
495
521
  xq-cli outline view --cid <cid> --out D:\\output\\outline.json
496
522
  xq-cli outline update --cid <cid> --file D:\\output\\outline.json --dry-run --json
@@ -518,6 +544,7 @@ Common options
518
544
  --timeout-sec <n> Poll timeout in seconds, default 600
519
545
  --interval-sec <n> Poll interval in seconds, default 10
520
546
  --reference-type <0|1|2> Outline reference choice: 0=merge, 1=format only, 2=score only
547
+ --bidder-role <1|2> Goods supply method: 1=self production, 2=procured supply
521
548
  --browser Skip the local login page and open browser authorization directly
522
549
  --api-key <key> Save a user API key locally and verify it with /user/info
523
550
  --no-open Do not open the local login page automatically
@@ -531,7 +558,8 @@ Common options
531
558
  Outline config
532
559
  --page-scope <code> Full-length preset. See "xq-cli choices outline"
533
560
  --page-scope-code <code> Alias of --page-scope
534
- --base <0|1|standard|expert>
561
+ --writing-quality <0|1|2|standard|expert|flagship> 0=standard writing, 1=expert, 2=flagship
562
+ --base <0|1|standard|expert> Deprecated compatibility alias for writing quality
535
563
  --theme-style <1|2|3|4|5|enhanced|table|rich|basic|text>
536
564
  --table-quantity <0|1|2|none|few|rich>
537
565
  --table-color <black|blue|red|green|purple|cyan|orange>
@@ -926,6 +954,41 @@ async function handlePeriodConfirm(args, state) {
926
954
  return payload;
927
955
  }
928
956
 
957
+ async function handleBidderRole(args, state) {
958
+ const client = createAuthorizedClient(args, state);
959
+ const cid = resolveCid(args, state);
960
+ const snapshot = await hydrateTaskSnapshot(client, state, cid);
961
+ const uuid = stringOption(args, 'uuid', snapshot.uuid);
962
+ if (!uuid) {
963
+ throw new Error(`No uuid found for task ${cid}. Pass --uuid explicitly or run init first.`);
964
+ }
965
+ const bidderRole = numberOption(args, 'bidderRole');
966
+ if (![1, 2].includes(bidderRole)) {
967
+ throw new Error('Option --bidder-role expects 1 (self production) or 2 (procured supply).');
968
+ }
969
+ const response = await getJson(client, '/proxy/savebidderRole', {
970
+ uuid,
971
+ bidderRole,
972
+ });
973
+ saveTaskSnapshot(state, cid, {
974
+ uuid,
975
+ bidderRole,
976
+ });
977
+ const payload = {
978
+ command: 'bidder-role',
979
+ cid,
980
+ uuid,
981
+ bidderRole,
982
+ response,
983
+ };
984
+ outputResult(args, payload, [
985
+ `bidder role saved: cid=${cid}`,
986
+ `uuid: ${uuid}`,
987
+ `bidder role: ${bidderRole === 1 ? 'self production' : 'procured supply'}`,
988
+ ]);
989
+ return payload;
990
+ }
991
+
929
992
  function handleChoices(args) {
930
993
  const scope = normalizeChoicesScope(args._[1] || 'all');
931
994
  const payload = buildChoicesPayload(scope);
@@ -2063,7 +2126,13 @@ async function fetchAuthoritativeTaskState(client, cid, options = {}) {
2063
2126
 
2064
2127
  function buildOutlineParams(snapshot, args) {
2065
2128
  const pageScopeCode = enumOption(args, ['pageScope', 'pageScopeCode'], PAGE_SCOPE_OPTIONS, snapshot.pageScopeCode ?? DEFAULT_PAGE_SCOPE_CODE);
2066
- const base = enumOption(args, 'base', BASE_OPTIONS, snapshot.base ?? DEFAULT_BASE);
2129
+ const writingQuality = enumOption(
2130
+ args,
2131
+ ['writingQuality', 'writingMode', 'base'],
2132
+ WRITING_QUALITY_OPTIONS,
2133
+ snapshot.writingQuality ?? (String(snapshot.base ?? DEFAULT_BASE) === '1' ? 1 : 0),
2134
+ );
2135
+ const base = pageScopeCode <= 0 ? '0' : writingQuality === 1 ? '1' : '0';
2067
2136
  const uuid = snapshot.uuid;
2068
2137
  const title = stringOption(args, 'title', snapshot.projectName || snapshot.title);
2069
2138
  const plan = stringOption(args, 'plan', snapshot.plan || '');
@@ -2092,7 +2161,9 @@ function buildOutlineParams(snapshot, args) {
2092
2161
  tableStyle: enumOption(args, 'tableStyle', TABLE_STYLE_OPTIONS, snapshot.tableStyle),
2093
2162
  annexIds: snapshot.annexIds || [],
2094
2163
  knowledgeProductIds: snapshot.knowledgeProductIds || [],
2095
- base: pageScopeCode <= 0 ? '0' : base,
2164
+ base,
2165
+ writingQuality,
2166
+ deepThinkingFlowVersion: writingQuality === 2 ? 1 : null,
2096
2167
  bidFileIds: [uuid],
2097
2168
  directoryNodes: [],
2098
2169
  generateType: 1,
@@ -3347,6 +3418,7 @@ function buildChoicesPayload(scope) {
3347
3418
  payload.outline = {
3348
3419
  pageScope: PAGE_SCOPE_OPTIONS,
3349
3420
  base: BASE_OPTIONS,
3421
+ writingQuality: WRITING_QUALITY_OPTIONS,
3350
3422
  themeStyle: THEME_STYLE_OPTIONS,
3351
3423
  tableQuantity: TABLE_QUANTITY_OPTIONS,
3352
3424
  tableColor: TABLE_COLOR_OPTIONS,
@@ -3391,6 +3463,7 @@ function renderChoicesLines(payload) {
3391
3463
  lines.push('outline:');
3392
3464
  lines.push(` page-scope: ${formatChoiceOptions(PAGE_SCOPE_OPTIONS)}`);
3393
3465
  lines.push(` base: ${formatChoiceOptions(BASE_OPTIONS)}`);
3466
+ lines.push(` writing-quality: ${formatChoiceOptions(WRITING_QUALITY_OPTIONS)}`);
3394
3467
  lines.push(` theme-style: ${formatChoiceOptions(THEME_STYLE_OPTIONS)}`);
3395
3468
  lines.push(` table-quantity: ${formatChoiceOptions(TABLE_QUANTITY_OPTIONS)}`);
3396
3469
  lines.push(` table-color: ${formatChoiceOptions(TABLE_COLOR_OPTIONS)}`);
@@ -3505,18 +3578,20 @@ async function collectOutlineInteractiveArgs(args, snapshot, context = null, opt
3505
3578
  nextArgs.pageScope = pageScopeCode;
3506
3579
 
3507
3580
  if (pageScopeCode <= 0) {
3508
- promptContext.promptStream.write('\u5DF2\u9009\u62E9\u77ED\u7BC7\u6A21\u5F0F\uFF0C\u5199\u4F5C\u6A21\u5F0F\u5C06\u56FA\u5B9A\u4E3A\u201C\u6807\u51C6\u5199\u4F5C\u201D\u3002\n');
3581
+ promptContext.promptStream.write('\u5DF2\u9009\u62E9\u77ED\u7BC7\u6A21\u5F0F\uFF0C\u5199\u4F5C\u8D28\u91CF\u5C06\u56FA\u5B9A\u4E3A\u201C\u6807\u51C6\u5199\u4F5C\u201D\u3002\n');
3582
+ nextArgs.writingQuality = 0;
3509
3583
  nextArgs.base = '0';
3510
3584
  } else {
3511
- nextArgs.base = await promptChoice(promptContext, {
3512
- title: '\u5199\u4F5C\u6A21\u5F0F',
3513
- question: '\u8BF7\u9009\u62E9\u5199\u4F5C\u6A21\u5F0F',
3514
- options: BASE_OPTIONS.map(option => ({
3585
+ nextArgs.writingQuality = await promptChoice(promptContext, {
3586
+ title: '\u5199\u4F5C\u8D28\u91CF',
3587
+ question: '\u8BF7\u9009\u62E9\u5199\u4F5C\u8D28\u91CF',
3588
+ options: WRITING_QUALITY_OPTIONS.map(option => ({
3515
3589
  ...option,
3516
3590
  promptLabel: BASE_PROMPT_LABELS[option.value] || option.label,
3517
3591
  })),
3518
- defaultValue: enumOption(args, 'base', BASE_OPTIONS, defaults.base),
3592
+ defaultValue: enumOption(args, ['writingQuality', 'writingMode', 'base'], WRITING_QUALITY_OPTIONS, defaults.writingQuality),
3519
3593
  });
3594
+ nextArgs.base = nextArgs.writingQuality === 1 ? '1' : '0';
3520
3595
  }
3521
3596
 
3522
3597
  nextArgs.themeStyle = await promptChoice(promptContext, {
@@ -3739,9 +3814,11 @@ async function collectExportInteractiveArgs(args, snapshot, context = null, opti
3739
3814
  }
3740
3815
 
3741
3816
  function buildInteractiveSnapshotDefaults(source = {}) {
3817
+ const writingQuality = source.writingQuality ?? (String(source.base ?? DEFAULT_BASE) === '1' ? 1 : 0);
3742
3818
  return {
3743
3819
  pageScopeCode: source.pageScopeCode ?? DEFAULT_PAGE_SCOPE_CODE,
3744
3820
  base: source.base ?? DEFAULT_BASE,
3821
+ writingQuality,
3745
3822
  themeStyle: source.themeStyle ?? DEFAULT_THEME_STYLE,
3746
3823
  tableQuantity: source.tableQuantity ?? DEFAULT_TABLE_QUANTITY,
3747
3824
  tableColor: source.tableColor ?? DEFAULT_TABLE_COLOR,
@@ -4963,6 +5040,8 @@ function pickOutlineConfig(params) {
4963
5040
  return compactObject({
4964
5041
  pageScopeCode: params.pageScopeCode,
4965
5042
  base: params.base,
5043
+ writingQuality: params.writingQuality,
5044
+ deepThinkingFlowVersion: params.deepThinkingFlowVersion,
4966
5045
  themeStyle: params.themeStyle,
4967
5046
  tableQuantity: params.tableQuantity,
4968
5047
  tableColor: params.tableColor,
@@ -4985,6 +5064,9 @@ function buildOutlineConfigSummary(params) {
4985
5064
  return [
4986
5065
  `pageScope=${describeEnumValue(PAGE_SCOPE_OPTIONS, params.pageScopeCode)}`,
4987
5066
  `base=${describeEnumValue(BASE_OPTIONS, params.base)}`,
5067
+ params.writingQuality !== undefined
5068
+ ? `writingQuality=${describeEnumValue(WRITING_QUALITY_OPTIONS, params.writingQuality)}`
5069
+ : null,
4988
5070
  params.themeStyle !== undefined ? `themeStyle=${describeEnumValue(THEME_STYLE_OPTIONS, params.themeStyle)}` : null,
4989
5071
  params.tableQuantity !== undefined ? `tableQuantity=${describeEnumValue(TABLE_QUANTITY_OPTIONS, params.tableQuantity)}` : null,
4990
5072
  params.tableColor !== undefined ? `tableColor=${describeEnumValue(TABLE_COLOR_OPTIONS, params.tableColor)}` : null,
@@ -5180,6 +5262,8 @@ function pickTaskSnapshot(source) {
5180
5262
  rating: source.rating,
5181
5263
  plan: source.plan,
5182
5264
  base: source.base,
5265
+ writingQuality: source.writingQuality,
5266
+ deepThinkingFlowVersion: source.deepThinkingFlowVersion,
5183
5267
  pageScopeCode: source.pageScopeCode,
5184
5268
  task_status: source.task_status,
5185
5269
  plan_mode_phase: source.plan_mode_phase,
@@ -5211,6 +5295,7 @@ function pickTaskSnapshot(source) {
5211
5295
  multiBidType: source.multiBidType,
5212
5296
  choiceMultiBiddingId: source.choiceMultiBiddingId,
5213
5297
  epcEngineerType: source.epcEngineerType,
5298
+ bidderRole: source.bidderRole,
5214
5299
  outlineReferenceType: source.outlineReferenceType,
5215
5300
  referenceStatus: source.referenceStatus,
5216
5301
  themeStyleSetting: source.themeStyleSetting,