speccore 8.3.193 → 8.3.194

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.
Files changed (66) hide show
  1. package/README.en.md +212 -60
  2. package/README.md +183 -331
  3. package/dist/cli.js +16 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/analyze.d.ts +1 -0
  6. package/dist/commands/analyze.d.ts.map +1 -1
  7. package/dist/commands/analyze.js +160 -25
  8. package/dist/commands/analyze.js.map +1 -1
  9. package/dist/commands/change.js +51 -13
  10. package/dist/commands/change.js.map +1 -1
  11. package/dist/commands/doc2spec.d.ts.map +1 -1
  12. package/dist/commands/doc2spec.js +201 -7
  13. package/dist/commands/doc2spec.js.map +1 -1
  14. package/dist/commands/execute.js +38 -1
  15. package/dist/commands/execute.js.map +1 -1
  16. package/dist/commands/iteration/split.d.ts.map +1 -1
  17. package/dist/commands/iteration/split.js +51 -12
  18. package/dist/commands/iteration/split.js.map +1 -1
  19. package/dist/commands/plan.d.ts.map +1 -1
  20. package/dist/commands/plan.js +84 -12
  21. package/dist/commands/plan.js.map +1 -1
  22. package/dist/commands/pr.d.ts.map +1 -1
  23. package/dist/commands/pr.js +63 -3
  24. package/dist/commands/pr.js.map +1 -1
  25. package/dist/commands/req-doc.d.ts +1 -0
  26. package/dist/commands/req-doc.d.ts.map +1 -1
  27. package/dist/commands/req-doc.js +145 -54
  28. package/dist/commands/req-doc.js.map +1 -1
  29. package/dist/commands/run.d.ts +2 -0
  30. package/dist/commands/run.d.ts.map +1 -1
  31. package/dist/commands/run.js +45 -8
  32. package/dist/commands/run.js.map +1 -1
  33. package/dist/core/ask-engine.d.ts.map +1 -1
  34. package/dist/core/ask-engine.js +30 -4
  35. package/dist/core/ask-engine.js.map +1 -1
  36. package/dist/core/ask-llm.d.ts +12 -0
  37. package/dist/core/ask-llm.d.ts.map +1 -1
  38. package/dist/core/ask-llm.js +101 -4
  39. package/dist/core/ask-llm.js.map +1 -1
  40. package/dist/core/content-delivery.d.ts +9 -1
  41. package/dist/core/content-delivery.d.ts.map +1 -1
  42. package/dist/core/content-delivery.js +11 -0
  43. package/dist/core/content-delivery.js.map +1 -1
  44. package/dist/core/context-budget.d.ts +62 -0
  45. package/dist/core/context-budget.d.ts.map +1 -0
  46. package/dist/core/context-budget.js +128 -0
  47. package/dist/core/context-budget.js.map +1 -0
  48. package/dist/core/intent-recognition.d.ts.map +1 -1
  49. package/dist/core/intent-recognition.js +24 -6
  50. package/dist/core/intent-recognition.js.map +1 -1
  51. package/dist/core/pipeline-engine.d.ts +2 -0
  52. package/dist/core/pipeline-engine.d.ts.map +1 -1
  53. package/dist/core/pipeline-engine.js +9 -1
  54. package/dist/core/pipeline-engine.js.map +1 -1
  55. package/dist/core/prompt-builder.d.ts.map +1 -1
  56. package/dist/core/prompt-builder.js +18 -68
  57. package/dist/core/prompt-builder.js.map +1 -1
  58. package/dist/core/spec-paths.js +1 -1
  59. package/dist/core/spec-paths.js.map +1 -1
  60. package/dist/core/unified-config.d.ts +16 -0
  61. package/dist/core/unified-config.d.ts.map +1 -1
  62. package/dist/core/unified-config.js +57 -0
  63. package/dist/core/unified-config.js.map +1 -1
  64. package/dist/core/unit-context-assembler.js +21 -14
  65. package/dist/core/unit-context-assembler.js.map +1 -1
  66. package/package.json +1 -1
@@ -419,7 +419,38 @@ async function iterationSplitCommand(options) {
419
419
  // v8.3.166+: 输出 subagent 标记(task-decomposer)
420
420
  // v8.3.169+: 尝试通过 Qoder SDK 直接调度子 Agent
421
421
  const promptText = (0, prompt_builder_1.formatPrompt)(prompt) + featureBatchHint;
422
- if (!process.stdout.isTTY) {
422
+ let llmHandled = false;
423
+ let aiProvider = 'host';
424
+ try {
425
+ const { loadConfigWithMeta } = await Promise.resolve().then(() => __importStar(require('../../core/unified-config')));
426
+ const { config } = await loadConfigWithMeta();
427
+ aiProvider = config.settings.ai?.provider || 'host';
428
+ }
429
+ catch { /* 默认 host */ }
430
+ // v8.3.196+: 用自配 LLM 生成任务 JSON,成功设 llmHandled(供 llm 优先 / auto 回退复用)
431
+ const tryLlmTaskify = async () => {
432
+ try {
433
+ const { callLlm, resolveAiProviders } = await Promise.resolve().then(() => __importStar(require('../../core/ask-llm')));
434
+ const providers = await resolveAiProviders('taskify');
435
+ const llmContent = await callLlm('你是任务拆解专家。请按 prompt 要求拆分任务,只输出 JSON 数组格式的任务列表,不要输出 JSON 以外的文字。', promptText, providers, 4000);
436
+ if (llmContent) {
437
+ options.response = llmContent;
438
+ llmHandled = true;
439
+ return true;
440
+ }
441
+ }
442
+ catch (e) {
443
+ logger_1.logger.debug(`[split] 自配 LLM 生成失败: ${e.message}`);
444
+ }
445
+ return false;
446
+ };
447
+ // llm 优先模式:先用自配 LLM,失败回退宿主
448
+ if (aiProvider === 'llm') {
449
+ if (!(await tryLlmTaskify())) {
450
+ logger_1.logger.warn('⚠️ [llm] 自配 LLM 未生成任务,回退宿主模式');
451
+ }
452
+ }
453
+ if (!llmHandled && !process.stdout.isTTY) {
423
454
  try {
424
455
  const agentCtx = {
425
456
  subagent: 'task-decomposer',
@@ -442,21 +473,29 @@ async function iterationSplitCommand(options) {
442
473
  process.exitCode = 0;
443
474
  return;
444
475
  }
476
+ // 宿主 SDK 调度失败(success=false)→ auto 时回退自配 LLM
477
+ if (aiProvider === 'auto')
478
+ await tryLlmTaskify();
445
479
  }
446
480
  catch (e) {
447
- logger_1.logger.debug(`[split] SDK 调度尝试失败: ${e.message},回退到 Prompt 模式`);
481
+ logger_1.logger.debug(`[split] SDK 调度尝试失败: ${e.message}`);
482
+ // 宿主异常 → auto 时回退自配 LLM
483
+ if (aiProvider === 'auto')
484
+ await tryLlmTaskify();
448
485
  }
449
486
  }
450
- const output = [
451
- `[SPECCORE_SESSION_AGENT: task-decomposer]`,
452
- `[SPECCORE_CONTEXT_BUDGET: 12000]`,
453
- `[SPECCORE_CONTEXT_TYPE: full]`,
454
- ``,
455
- promptText,
456
- ].join('\n');
457
- process.stdout.write(output);
458
- process.exitCode = 10;
459
- return;
487
+ if (!llmHandled) {
488
+ const output = [
489
+ `[SPECCORE_SESSION_AGENT: task-decomposer]`,
490
+ `[SPECCORE_CONTEXT_BUDGET: 12000]`,
491
+ `[SPECCORE_CONTEXT_TYPE: full]`,
492
+ ``,
493
+ promptText,
494
+ ].join('\n');
495
+ process.stdout.write(output);
496
+ process.exitCode = 10;
497
+ return;
498
+ }
460
499
  }
461
500
  // ── Response 模式 ──
462
501
  if (options.response) {