speccore 8.3.21 → 8.3.26

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 (120) hide show
  1. package/README.md +7 -4
  2. package/dist/cli.js +19 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/analyze.d.ts.map +1 -1
  5. package/dist/commands/analyze.js +24 -8
  6. package/dist/commands/analyze.js.map +1 -1
  7. package/dist/commands/config.d.ts +3 -1
  8. package/dist/commands/config.d.ts.map +1 -1
  9. package/dist/commands/config.js +206 -90
  10. package/dist/commands/config.js.map +1 -1
  11. package/dist/commands/context-output.d.ts.map +1 -1
  12. package/dist/commands/context-output.js +0 -10
  13. package/dist/commands/context-output.js.map +1 -1
  14. package/dist/commands/dev.js +6 -7
  15. package/dist/commands/dev.js.map +1 -1
  16. package/dist/commands/doctor.d.ts.map +1 -1
  17. package/dist/commands/doctor.js +140 -0
  18. package/dist/commands/doctor.js.map +1 -1
  19. package/dist/commands/done.js +51 -20
  20. package/dist/commands/done.js.map +1 -1
  21. package/dist/commands/execute.d.ts.map +1 -1
  22. package/dist/commands/execute.js +147 -45
  23. package/dist/commands/execute.js.map +1 -1
  24. package/dist/commands/help.js +5 -0
  25. package/dist/commands/help.js.map +1 -1
  26. package/dist/commands/init.d.ts +0 -2
  27. package/dist/commands/init.d.ts.map +1 -1
  28. package/dist/commands/init.js +9 -51
  29. package/dist/commands/init.js.map +1 -1
  30. package/dist/commands/iteration/split.js +29 -17
  31. package/dist/commands/iteration/split.js.map +1 -1
  32. package/dist/commands/status-panel.d.ts.map +1 -1
  33. package/dist/commands/status-panel.js +13 -48
  34. package/dist/commands/status-panel.js.map +1 -1
  35. package/dist/commands/status.d.ts.map +1 -1
  36. package/dist/commands/status.js +32 -0
  37. package/dist/commands/status.js.map +1 -1
  38. package/dist/commands/update.d.ts.map +1 -1
  39. package/dist/commands/update.js +206 -8
  40. package/dist/commands/update.js.map +1 -1
  41. package/dist/commands/verdict.d.ts +16 -0
  42. package/dist/commands/verdict.d.ts.map +1 -0
  43. package/dist/commands/verdict.js +189 -0
  44. package/dist/commands/verdict.js.map +1 -0
  45. package/dist/commands/verify.d.ts.map +1 -1
  46. package/dist/commands/verify.js +3 -2
  47. package/dist/commands/verify.js.map +1 -1
  48. package/dist/core/analyze-engine.d.ts.map +1 -1
  49. package/dist/core/analyze-engine.js +3 -4
  50. package/dist/core/analyze-engine.js.map +1 -1
  51. package/dist/core/arbitration/arbitration-engine.d.ts +36 -0
  52. package/dist/core/arbitration/arbitration-engine.d.ts.map +1 -0
  53. package/dist/core/arbitration/arbitration-engine.js +142 -0
  54. package/dist/core/arbitration/arbitration-engine.js.map +1 -0
  55. package/dist/core/arbitration/conflict-detector.d.ts +15 -0
  56. package/dist/core/arbitration/conflict-detector.d.ts.map +1 -0
  57. package/dist/core/arbitration/conflict-detector.js +78 -0
  58. package/dist/core/arbitration/conflict-detector.js.map +1 -0
  59. package/dist/core/arbitration/conflict-types.d.ts +34 -0
  60. package/dist/core/arbitration/conflict-types.d.ts.map +1 -0
  61. package/dist/core/arbitration/conflict-types.js +8 -0
  62. package/dist/core/arbitration/conflict-types.js.map +1 -0
  63. package/dist/core/arbitration/contract-registry.d.ts +15 -0
  64. package/dist/core/arbitration/contract-registry.d.ts.map +1 -0
  65. package/dist/core/arbitration/contract-registry.js +185 -0
  66. package/dist/core/arbitration/contract-registry.js.map +1 -0
  67. package/dist/core/arbitration/contract-types.d.ts +33 -0
  68. package/dist/core/arbitration/contract-types.d.ts.map +1 -0
  69. package/dist/core/arbitration/contract-types.js +8 -0
  70. package/dist/core/arbitration/contract-types.js.map +1 -0
  71. package/dist/core/arbitration/index.d.ts +16 -0
  72. package/dist/core/arbitration/index.d.ts.map +1 -0
  73. package/dist/core/arbitration/index.js +32 -0
  74. package/dist/core/arbitration/index.js.map +1 -0
  75. package/dist/core/arbitration/l1-auto-arbiter.d.ts +19 -0
  76. package/dist/core/arbitration/l1-auto-arbiter.d.ts.map +1 -0
  77. package/dist/core/arbitration/l1-auto-arbiter.js +41 -0
  78. package/dist/core/arbitration/l1-auto-arbiter.js.map +1 -0
  79. package/dist/core/arbitration/l2-ai-arbiter.d.ts +19 -0
  80. package/dist/core/arbitration/l2-ai-arbiter.d.ts.map +1 -0
  81. package/dist/core/arbitration/l2-ai-arbiter.js +57 -0
  82. package/dist/core/arbitration/l2-ai-arbiter.js.map +1 -0
  83. package/dist/core/arbitration/l3-human-arbiter.d.ts +24 -0
  84. package/dist/core/arbitration/l3-human-arbiter.d.ts.map +1 -0
  85. package/dist/core/arbitration/l3-human-arbiter.js +65 -0
  86. package/dist/core/arbitration/l3-human-arbiter.js.map +1 -0
  87. package/dist/core/arbitration/verdict-generator.d.ts +16 -0
  88. package/dist/core/arbitration/verdict-generator.d.ts.map +1 -0
  89. package/dist/core/arbitration/verdict-generator.js +166 -0
  90. package/dist/core/arbitration/verdict-generator.js.map +1 -0
  91. package/dist/core/arbitration/verdict-types.d.ts +49 -0
  92. package/dist/core/arbitration/verdict-types.d.ts.map +1 -0
  93. package/dist/core/arbitration/verdict-types.js +8 -0
  94. package/dist/core/arbitration/verdict-types.js.map +1 -0
  95. package/dist/core/ask-config.d.ts +4 -3
  96. package/dist/core/ask-config.d.ts.map +1 -1
  97. package/dist/core/ask-config.js +79 -1
  98. package/dist/core/ask-config.js.map +1 -1
  99. package/dist/core/ask-engine.d.ts.map +1 -1
  100. package/dist/core/ask-engine.js +7 -0
  101. package/dist/core/ask-engine.js.map +1 -1
  102. package/dist/core/intent-recognition.d.ts +1 -1
  103. package/dist/core/intent-recognition.d.ts.map +1 -1
  104. package/dist/core/intent-recognition.js +10 -0
  105. package/dist/core/intent-recognition.js.map +1 -1
  106. package/dist/core/pattern-detector.d.ts +24 -0
  107. package/dist/core/pattern-detector.d.ts.map +1 -1
  108. package/dist/core/pattern-detector.js +172 -3
  109. package/dist/core/pattern-detector.js.map +1 -1
  110. package/dist/core/quality-audit.d.ts.map +1 -1
  111. package/dist/core/quality-audit.js +23 -15
  112. package/dist/core/quality-audit.js.map +1 -1
  113. package/dist/core/spec-skeleton.d.ts.map +1 -1
  114. package/dist/core/spec-skeleton.js +35 -12
  115. package/dist/core/spec-skeleton.js.map +1 -1
  116. package/dist/core/unified-config.d.ts +161 -27
  117. package/dist/core/unified-config.d.ts.map +1 -1
  118. package/dist/core/unified-config.js +856 -82
  119. package/dist/core/unified-config.js.map +1 -1
  120. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1-auto-arbiter.d.ts","sourceRoot":"","sources":["../../../src/core/arbitration/l1-auto-arbiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4BlF"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /**
3
+ * l1-auto-arbiter.ts — L1 机器契约自动裁决器
4
+ *
5
+ * v8.3.24+: 全自动裁决,无需人工参与
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.arbitrateL1 = arbitrateL1;
9
+ /**
10
+ * L1 裁决:机器自动裁决
11
+ * 当前实现:L1 冲突(编译失败等)直接裁决为 reject,因为编译器已尝试修复
12
+ * 未来可扩展:集成 AI 自动修复循环
13
+ */
14
+ async function arbitrateL1(conflict) {
15
+ const verdict = {
16
+ id: `V-${conflict.id}`,
17
+ taskId: conflict.taskId,
18
+ conflictId: conflict.id,
19
+ level: 'L1',
20
+ outcome: conflict.violation.severity === 'fatal' ? 'reject' : 'pass',
21
+ reasoning: conflict.violation.severity === 'fatal'
22
+ ? 'L1 机器契约被违反且为致命错误,自动裁决驳回。修复后需重新执行。'
23
+ : 'L1 机器契约警告级别,自动裁决通过但需关注。',
24
+ arbiter: 'L1-Auto-Arbiter',
25
+ timestamp: new Date().toISOString(),
26
+ };
27
+ const updatedConflict = {
28
+ ...conflict,
29
+ status: conflict.violation.severity === 'fatal' ? 'resolved' : 'overridden',
30
+ resolvedAt: new Date().toISOString(),
31
+ resolvedBy: 'machine',
32
+ resolution: verdict.reasoning,
33
+ arbiter: verdict.arbiter,
34
+ };
35
+ return {
36
+ verdict,
37
+ conflict: updatedConflict,
38
+ passed: conflict.violation.severity !== 'fatal',
39
+ };
40
+ }
41
+ //# sourceMappingURL=l1-auto-arbiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1-auto-arbiter.js","sourceRoot":"","sources":["../../../src/core/arbitration/l1-auto-arbiter.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAgBH,kCA4BC;AAjCD;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAAC,QAAkB;IAClD,MAAM,OAAO,GAAY;QACvB,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE;QACtB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;QACpE,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,KAAK,OAAO;YAChD,CAAC,CAAC,mCAAmC;YACrC,CAAC,CAAC,yBAAyB;QAC7B,OAAO,EAAE,iBAAiB;QAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,MAAM,eAAe,GAAa;QAChC,GAAG,QAAQ;QACX,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;QAC3E,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,OAAO,CAAC,SAAS;QAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,KAAK,OAAO;KAChD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * l2-ai-arbiter.ts — L2 规范契约 AI 辅助裁决器
3
+ *
4
+ * v8.3.24+: AI 生成修复建议,等待开发者确认
5
+ */
6
+ import type { Conflict } from './conflict-types';
7
+ import type { Verdict } from './verdict-types';
8
+ export interface L2ArbitrationResult {
9
+ verdict?: Verdict;
10
+ conflict: Conflict;
11
+ suggestedFix?: string;
12
+ needsHumanConfirm: boolean;
13
+ }
14
+ /**
15
+ * L2 裁决:AI 辅助裁决
16
+ * 生成修复建议,将冲突状态改为 pending-fix 等待确认
17
+ */
18
+ export declare function arbitrateL2(conflict: Conflict): Promise<L2ArbitrationResult>;
19
+ //# sourceMappingURL=l2-ai-arbiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l2-ai-arbiter.d.ts","sourceRoot":"","sources":["../../../src/core/arbitration/l2-ai-arbiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmBlF"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * l2-ai-arbiter.ts — L2 规范契约 AI 辅助裁决器
4
+ *
5
+ * v8.3.24+: AI 生成修复建议,等待开发者确认
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.arbitrateL2 = arbitrateL2;
9
+ /**
10
+ * L2 裁决:AI 辅助裁决
11
+ * 生成修复建议,将冲突状态改为 pending-fix 等待确认
12
+ */
13
+ async function arbitrateL2(conflict) {
14
+ // 生成基于契约类型的修复建议
15
+ const fix = generateFixSuggestion(conflict);
16
+ const updatedConflict = {
17
+ ...conflict,
18
+ status: 'pending-fix',
19
+ violation: {
20
+ ...conflict.violation,
21
+ suggestedFix: fix,
22
+ },
23
+ arbiter: 'L2-AI-Arbiter',
24
+ };
25
+ return {
26
+ conflict: updatedConflict,
27
+ suggestedFix: fix,
28
+ needsHumanConfirm: true,
29
+ };
30
+ }
31
+ /** 根据契约类型生成修复建议 */
32
+ function generateFixSuggestion(conflict) {
33
+ const { contractId, message } = conflict.violation;
34
+ switch (contractId) {
35
+ case 'L2-spec-consistency':
36
+ return `【Spec 不一致修复建议】\n1. 对比 REQ.md 验收标准与代码实现\n2. 补充缺失的逻辑分支或校验\n3. 重新运行 speccore execute 验证\n\n具体: ${message}`;
37
+ case 'L2-api-contract':
38
+ return `【API 契约修复建议】\n1. 检查 API_CONTRACT.yaml 中的字段定义\n2. 确保响应 DTO 包含所有必需字段\n3. 确保请求参数校验与契约一致\n\n具体: ${message}`;
39
+ case 'L2-schema':
40
+ return `【Schema 修复建议】\n1. 对比 SCHEMA.md 中的实体定义\n2. 确保数据库字段、Entity、DTO 三者一致\n3. 如有变更,同步更新迁移脚本\n\n具体: ${message}`;
41
+ case 'L2-lint':
42
+ return `【Lint 修复建议】\n1. 运行自动格式化: npx eslint --fix\n2. 检查剩余的手动修复项\n3. 确保代码风格与项目规范一致\n\n具体: ${message}`;
43
+ case 'L2-dev-guide':
44
+ return `【DEV_GUIDE 修复建议】\n1. 对照 DEV_GUIDE 中的改造范围清单\n2. 确认所有要求项已实现\n3. 如有偏差,在 TASK.md 中说明原因\n\n具体: ${message}`;
45
+ case 'L2-test-coverage':
46
+ return `【测试覆盖修复建议】\n1. 对照 TEST.md 中的测试用例\n2. 为新增代码补充单元测试\n3. 确保边界条件和异常路径有覆盖\n\n具体: ${message}`;
47
+ case 'L2-review':
48
+ return `【评审项修复建议】\n1. 对照 REVIEW.md 中的评审清单\n2. 逐项确认已实现或已说明例外\n3. 如有未满足项,补充实现\n\n具体: ${message}`;
49
+ case 'L2-error-code':
50
+ return `【错误码修复建议】\n1. 检查 ERROR_CODES.md 中的定义\n2. 确保代码中使用的错误码与文档一致\n3. 新增错误码需同步更新文档\n\n具体: ${message}`;
51
+ case 'L2-spec-doc-quality':
52
+ return `【文档质量修复建议】\n1. 确保 REQ.md 有明确的验收标准\n2. 确保 TECH.md 有技术方案细节\n3. 补充缺失的字段说明或流程图\n\n具体: ${message}`;
53
+ default:
54
+ return `【通用修复建议】\n1. 分析冲突原因: ${message}\n2. 参考项目规范文档修复\n3. 重新运行验证确认`;
55
+ }
56
+ }
57
+ //# sourceMappingURL=l2-ai-arbiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l2-ai-arbiter.js","sourceRoot":"","sources":["../../../src/core/arbitration/l2-ai-arbiter.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAgBH,kCAmBC;AAvBD;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,QAAkB;IAClD,gBAAgB;IAChB,MAAM,GAAG,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAE5C,MAAM,eAAe,GAAa;QAChC,GAAG,QAAQ;QACX,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE;YACT,GAAG,QAAQ,CAAC,SAAS;YACrB,YAAY,EAAE,GAAG;SAClB;QACD,OAAO,EAAE,eAAe;KACzB,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,eAAe;QACzB,YAAY,EAAE,GAAG;QACjB,iBAAiB,EAAE,IAAI;KACxB,CAAC;AACJ,CAAC;AAED,mBAAmB;AACnB,SAAS,qBAAqB,CAAC,QAAkB;IAC/C,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;IAEnD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,qBAAqB;YACxB,OAAO,+FAA+F,OAAO,EAAE,CAAC;QAElH,KAAK,iBAAiB;YACpB,OAAO,+FAA+F,OAAO,EAAE,CAAC;QAElH,KAAK,WAAW;YACd,OAAO,8FAA8F,OAAO,EAAE,CAAC;QAEjH,KAAK,SAAS;YACZ,OAAO,qFAAqF,OAAO,EAAE,CAAC;QAExG,KAAK,cAAc;YACjB,OAAO,6FAA6F,OAAO,EAAE,CAAC;QAEhH,KAAK,kBAAkB;YACrB,OAAO,8EAA8E,OAAO,EAAE,CAAC;QAEjG,KAAK,WAAW;YACd,OAAO,8EAA8E,OAAO,EAAE,CAAC;QAEjG,KAAK,eAAe;YAClB,OAAO,qFAAqF,OAAO,EAAE,CAAC;QAExG,KAAK,qBAAqB;YACxB,OAAO,qFAAqF,OAAO,EAAE,CAAC;QAExG;YACE,OAAO,wBAAwB,OAAO,8BAA8B,CAAC;IACzE,CAAC;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * l3-human-arbiter.ts — L3 架构契约人工裁决器
3
+ *
4
+ * v8.3.24+: 人工最终裁决,AI 提供决策支持
5
+ */
6
+ import type { Conflict } from './conflict-types';
7
+ import type { Verdict, VerdictOutcome } from './verdict-types';
8
+ export interface L3ArbitrationResult {
9
+ verdict: Verdict;
10
+ conflict: Conflict;
11
+ }
12
+ /**
13
+ * L3 裁决:初始化人工裁决流程
14
+ * 将冲突状态改为 pending-review,等待人工决策
15
+ */
16
+ export declare function initiateL3Arbitration(conflict: Conflict): Promise<L3ArbitrationResult>;
17
+ /**
18
+ * 人工做出裁决
19
+ */
20
+ export declare function makeHumanVerdict(conflict: Conflict, outcome: VerdictOutcome, reasoning: string, options?: {
21
+ conditions?: string[];
22
+ signature?: string;
23
+ }): L3ArbitrationResult;
24
+ //# sourceMappingURL=l3-human-arbiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l3-human-arbiter.d.ts","sourceRoot":"","sources":["../../../src/core/arbitration/l3-human-arbiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuB5F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,mBAAmB,CA2BrB"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * l3-human-arbiter.ts — L3 架构契约人工裁决器
4
+ *
5
+ * v8.3.24+: 人工最终裁决,AI 提供决策支持
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.initiateL3Arbitration = initiateL3Arbitration;
9
+ exports.makeHumanVerdict = makeHumanVerdict;
10
+ /**
11
+ * L3 裁决:初始化人工裁决流程
12
+ * 将冲突状态改为 pending-review,等待人工决策
13
+ */
14
+ async function initiateL3Arbitration(conflict) {
15
+ const updatedConflict = {
16
+ ...conflict,
17
+ status: 'pending-review',
18
+ arbiter: 'L3-Human-Arbiter (pending)',
19
+ };
20
+ // 生成一个占位裁决,表示等待人工决策
21
+ const verdict = {
22
+ id: `V-${conflict.id}`,
23
+ taskId: conflict.taskId,
24
+ conflictId: conflict.id,
25
+ level: 'L3',
26
+ outcome: 'defer',
27
+ reasoning: 'L3 架构契约冲突需人工最终裁决。AI 已生成影响分析,请执行 speccore verdict --conflict {id} --decide 进行裁决。',
28
+ arbiter: 'L3-Human-Arbiter (pending)',
29
+ timestamp: new Date().toISOString(),
30
+ };
31
+ return {
32
+ verdict,
33
+ conflict: updatedConflict,
34
+ };
35
+ }
36
+ /**
37
+ * 人工做出裁决
38
+ */
39
+ function makeHumanVerdict(conflict, outcome, reasoning, options) {
40
+ const verdict = {
41
+ id: `V-${conflict.id}-final`,
42
+ taskId: conflict.taskId,
43
+ conflictId: conflict.id,
44
+ level: 'L3',
45
+ outcome,
46
+ reasoning,
47
+ conditions: options?.conditions,
48
+ arbiter: 'Human',
49
+ timestamp: new Date().toISOString(),
50
+ signature: options?.signature,
51
+ };
52
+ const updatedConflict = {
53
+ ...conflict,
54
+ status: outcome === 'reject' ? 'resolved' : outcome === 'pass' || outcome === 'pass-with-conditions' ? 'overridden' : 'escalated',
55
+ resolvedAt: new Date().toISOString(),
56
+ resolvedBy: 'human',
57
+ resolution: reasoning,
58
+ arbiter: verdict.arbiter,
59
+ };
60
+ return {
61
+ verdict,
62
+ conflict: updatedConflict,
63
+ };
64
+ }
65
+ //# sourceMappingURL=l3-human-arbiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l3-human-arbiter.js","sourceRoot":"","sources":["../../../src/core/arbitration/l3-human-arbiter.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAcH,sDAuBC;AAKD,4CAmCC;AAnED;;;GAGG;AACI,KAAK,UAAU,qBAAqB,CAAC,QAAkB;IAC5D,MAAM,eAAe,GAAa;QAChC,GAAG,QAAQ;QACX,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,4BAA4B;KACtC,CAAC;IAEF,oBAAoB;IACpB,MAAM,OAAO,GAAY;QACvB,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE;QACtB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,iFAAiF;QAC5F,OAAO,EAAE,4BAA4B;QACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,eAAe;KAC1B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,QAAkB,EAClB,OAAuB,EACvB,SAAiB,EACjB,OAGC;IAED,MAAM,OAAO,GAAY;QACvB,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,QAAQ;QAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,KAAK,EAAE,IAAI;QACX,OAAO;QACP,SAAS;QACT,UAAU,EAAE,OAAO,EAAE,UAAU;QAC/B,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,OAAO,EAAE,SAAS;KAC9B,CAAC;IAEF,MAAM,eAAe,GAAa;QAChC,GAAG,QAAQ;QACX,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,sBAAsB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW;QACjI,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,SAAS;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,eAAe;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * verdict-generator.ts — 裁决书生成器
3
+ *
4
+ * v8.3.24+: 生成标准化的 ARBITRATION_REPORT.md
5
+ */
6
+ import type { Conflict, ConflictDetectionResult } from './conflict-types';
7
+ import type { Verdict, ArbitrationReport } from './verdict-types';
8
+ /**
9
+ * 生成裁决书对象
10
+ */
11
+ export declare function generateArbitrationReport(taskId: string, detection: ConflictDetectionResult, resolvedConflicts: Conflict[], verdicts: Verdict[]): ArbitrationReport;
12
+ /**
13
+ * 生成并写入 ARBITRATION_REPORT.md
14
+ */
15
+ export declare function writeArbitrationReport(report: ArbitrationReport, taskDir: string): Promise<void>;
16
+ //# sourceMappingURL=verdict-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-generator.d.ts","sourceRoot":"","sources":["../../../src/core/arbitration/verdict-generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAElE;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,uBAAuB,EAClC,iBAAiB,EAAE,QAAQ,EAAE,EAC7B,QAAQ,EAAE,OAAO,EAAE,GAClB,iBAAiB,CA8DnB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA8Ff"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ /**
3
+ * verdict-generator.ts — 裁决书生成器
4
+ *
5
+ * v8.3.24+: 生成标准化的 ARBITRATION_REPORT.md
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.generateArbitrationReport = generateArbitrationReport;
9
+ exports.writeArbitrationReport = writeArbitrationReport;
10
+ const path_1 = require("path");
11
+ const fs_extra_1 = require("fs-extra");
12
+ const contract_registry_1 = require("./contract-registry");
13
+ /**
14
+ * 生成裁决书对象
15
+ */
16
+ function generateArbitrationReport(taskId, detection, resolvedConflicts, verdicts) {
17
+ const conflictMap = new Map();
18
+ for (const c of resolvedConflicts) {
19
+ conflictMap.set(c.id, c);
20
+ }
21
+ const verdictMap = new Map();
22
+ for (const v of verdicts) {
23
+ verdictMap.set(v.conflictId, v);
24
+ }
25
+ // v8.3.24+: 使用 resolvedConflicts(已裁决状态)而非 detection.conflicts(原始 detected 状态)
26
+ const l1List = resolvedConflicts.filter((c) => c.contractId.startsWith('L1-'));
27
+ const l2List = resolvedConflicts.filter((c) => c.contractId.startsWith('L2-'));
28
+ const l3List = resolvedConflicts.filter((c) => c.contractId.startsWith('L3-'));
29
+ const L1Passed = l1List.filter((c) => c.status === 'overridden' || c.status === 'resolved').length;
30
+ const L2Passed = l2List.filter((c) => c.status === 'overridden' || c.status === 'resolved').length;
31
+ const L3Passed = l3List.filter((c) => c.status === 'overridden' || c.status === 'resolved').length;
32
+ const status = detection.summary.total === 0
33
+ ? 'resolved'
34
+ : resolvedConflicts.some((c) => c.status === 'pending-review')
35
+ ? 'pending'
36
+ : resolvedConflicts.some((c) => c.status === 'pending-fix')
37
+ ? 'partial'
38
+ : 'resolved';
39
+ return {
40
+ taskId,
41
+ timestamp: new Date().toISOString().replace('T', ' ').slice(0, 19),
42
+ status,
43
+ L1: {
44
+ total: detection.summary.L1,
45
+ passed: L1Passed,
46
+ failed: detection.summary.L1 - L1Passed,
47
+ },
48
+ L2: {
49
+ total: detection.summary.L2,
50
+ passed: L2Passed,
51
+ pending: l2List.filter((c) => c.status === 'pending-fix').length,
52
+ failed: detection.summary.L2 - L2Passed - l2List.filter((c) => c.status === 'pending-fix').length,
53
+ },
54
+ L3: {
55
+ total: detection.summary.L3,
56
+ passed: L3Passed,
57
+ pending: l3List.filter((c) => c.status === 'pending-review').length,
58
+ failed: detection.summary.L3 - L3Passed - l3List.filter((c) => c.status === 'pending-review').length,
59
+ },
60
+ conflicts: resolvedConflicts.map((c) => {
61
+ const contract = (0, contract_registry_1.getContractById)(c.contractId);
62
+ return {
63
+ id: c.id,
64
+ level: contract?.level || 'unknown',
65
+ contractName: contract?.name || c.contractId,
66
+ status: c.status,
67
+ message: c.violation.message,
68
+ verdict: verdictMap.get(c.id),
69
+ };
70
+ }),
71
+ };
72
+ }
73
+ /**
74
+ * 生成并写入 ARBITRATION_REPORT.md
75
+ */
76
+ async function writeArbitrationReport(report, taskDir) {
77
+ const lines = [];
78
+ lines.push(`# 冲突裁决书 — ${report.taskId}`);
79
+ lines.push('');
80
+ lines.push(`> 裁决时间: ${report.timestamp}`);
81
+ const statusIcon = report.status === 'resolved' ? '✅ 全部通过'
82
+ : report.status === 'partial' ? '🟡 部分通过'
83
+ : report.status === 'pending' ? '⏳ 等待裁决'
84
+ : '❌ 已驳回';
85
+ lines.push(`> 裁决状态: ${statusIcon}`);
86
+ lines.push('');
87
+ // L1
88
+ lines.push('---');
89
+ lines.push('');
90
+ lines.push('## 一、L1 机器契约裁决(⚙️ 全自动)');
91
+ lines.push('');
92
+ if (report.L1.total === 0) {
93
+ lines.push('**全部通过,机器契约履行完毕。**');
94
+ }
95
+ else {
96
+ lines.push(`| 契约 | 状态 | 详情 |`);
97
+ lines.push(`| :--- | :--- | :--- |`);
98
+ for (const c of report.conflicts.filter((c) => c.level === 'L1')) {
99
+ const icon = c.status === 'resolved' ? '❌' : c.status === 'overridden' ? '⚠️' : '⏳';
100
+ lines.push(`| ${c.contractName} | ${icon} ${c.status} | ${c.message} |`);
101
+ }
102
+ lines.push('');
103
+ lines.push(`**L1 裁决结论: ${report.L1.failed > 0 ? '存在致命错误,已阻断。' : '全部通过。'}**`);
104
+ }
105
+ lines.push('');
106
+ // L2
107
+ lines.push('---');
108
+ lines.push('');
109
+ lines.push('## 二、L2 规范契约裁决(🤖 AI 辅助)');
110
+ lines.push('');
111
+ if (report.L2.total === 0) {
112
+ lines.push('**全部通过,规范契约履行完毕。**');
113
+ }
114
+ else {
115
+ for (const c of report.conflicts.filter((c) => c.level === 'L2')) {
116
+ lines.push(`### ${c.contractName}`);
117
+ lines.push(`- **状态**: ${c.status}`);
118
+ lines.push(`- **说明**: ${c.message}`);
119
+ if (c.verdict) {
120
+ lines.push(`- **裁决**: ${c.verdict.outcome} (${c.verdict.arbiter})`);
121
+ }
122
+ lines.push('');
123
+ }
124
+ }
125
+ lines.push('');
126
+ // L3
127
+ lines.push('---');
128
+ lines.push('');
129
+ lines.push('## 三、L3 架构契约裁决(👤 人工最终)');
130
+ lines.push('');
131
+ if (report.L3.total === 0) {
132
+ lines.push('**全部通过,架构契约履行完毕。**');
133
+ }
134
+ else {
135
+ for (const c of report.conflicts.filter((c) => c.level === 'L3')) {
136
+ lines.push(`### ${c.contractName}`);
137
+ lines.push(`- **状态**: ${c.status}`);
138
+ lines.push(`- **说明**: ${c.message}`);
139
+ if (c.status === 'pending-review') {
140
+ lines.push(`- **⚠️ 此冲突需人工裁决,请执行: \`speccore verdict --conflict ${c.id} --decide\`**`);
141
+ }
142
+ if (c.verdict) {
143
+ lines.push(`- **裁决**: ${c.verdict.outcome}`);
144
+ lines.push(`- **理由**: ${c.verdict.reasoning}`);
145
+ }
146
+ lines.push('');
147
+ }
148
+ }
149
+ lines.push('');
150
+ // 汇总
151
+ lines.push('---');
152
+ lines.push('');
153
+ lines.push('## 四、裁决汇总');
154
+ lines.push('');
155
+ lines.push(`| 层级 | 冲突数 | 已通过 | 待确认 | 待裁决 | 已驳回 |`);
156
+ lines.push(`| :--- | :--- | :--- | :--- | :--- | :--- |`);
157
+ lines.push(`| L1 机器契约 | ${report.L1.total} | ${report.L1.passed} | — | — | ${report.L1.failed} |`);
158
+ lines.push(`| L2 规范契约 | ${report.L2.total} | ${report.L2.passed} | ${report.L2.pending} | — | ${report.L2.failed} |`);
159
+ lines.push(`| L3 架构契约 | ${report.L3.total} | ${report.L3.passed} | — | ${report.L3.pending} | ${report.L3.failed} |`);
160
+ lines.push('');
161
+ lines.push(`**当前任务状态**: ${statusIcon}`);
162
+ lines.push('');
163
+ const content = lines.join('\n');
164
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'ARBITRATION_REPORT.md'), content, 'utf-8');
165
+ }
166
+ //# sourceMappingURL=verdict-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-generator.js","sourceRoot":"","sources":["../../../src/core/arbitration/verdict-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * verdict-types.ts — 裁决书类型定义
3
+ *
4
+ * v8.3.24+: 契约冲突裁决模型核心类型
5
+ */
6
+ export type VerdictOutcome = 'pass' | 'pass-with-conditions' | 'reject' | 'defer' | 'escalate';
7
+ export interface Verdict {
8
+ id: string;
9
+ taskId: string;
10
+ conflictId: string;
11
+ level: 'L1' | 'L2' | 'L3';
12
+ outcome: VerdictOutcome;
13
+ reasoning: string;
14
+ conditions?: string[];
15
+ arbiter: string;
16
+ timestamp: string;
17
+ signature?: string;
18
+ }
19
+ export interface ArbitrationReport {
20
+ taskId: string;
21
+ timestamp: string;
22
+ status: 'pending' | 'partial' | 'resolved' | 'rejected';
23
+ L1: {
24
+ total: number;
25
+ passed: number;
26
+ failed: number;
27
+ };
28
+ L2: {
29
+ total: number;
30
+ passed: number;
31
+ pending: number;
32
+ failed: number;
33
+ };
34
+ L3: {
35
+ total: number;
36
+ passed: number;
37
+ pending: number;
38
+ failed: number;
39
+ };
40
+ conflicts: Array<{
41
+ id: string;
42
+ level: string;
43
+ contractName: string;
44
+ status: string;
45
+ message: string;
46
+ verdict?: Verdict;
47
+ }>;
48
+ }
49
+ //# sourceMappingURL=verdict-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-types.d.ts","sourceRoot":"","sources":["../../../src/core/arbitration/verdict-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,sBAAsB,GACtB,QAAQ,GACR,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IACxD,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;CACJ"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * verdict-types.ts — 裁决书类型定义
4
+ *
5
+ * v8.3.24+: 契约冲突裁决模型核心类型
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=verdict-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-types.js","sourceRoot":"","sources":["../../../src/core/arbitration/verdict-types.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
@@ -27,13 +27,13 @@ export interface AskConfig {
27
27
  export interface LlmProviderConfig {
28
28
  name: string;
29
29
  enabled: boolean;
30
- /** provider 类型:openai / ollama / custom */
31
- type: 'openai' | 'ollama' | 'custom';
30
+ /** provider 类型:openai / ollama / anthropic / custom */
31
+ type: 'openai' | 'ollama' | 'anthropic' | 'custom';
32
32
  /** API endpoint(OpenAI兼容格式或Ollama本地地址) */
33
33
  endpoint?: string;
34
34
  /** 模型名称 */
35
35
  model?: string;
36
- /** API Key(优先读取环境变量 SPECCORE_LLM_KEY) */
36
+ /** API Key(支持环境变量引用:${SPECCORE_LLM_KEY}) */
37
37
  apiKey?: string;
38
38
  /** 优先级:数字越小越优先 */
39
39
  priority: number;
@@ -41,6 +41,7 @@ export interface LlmProviderConfig {
41
41
  export declare const DEFAULT_ASK_CONFIG: AskConfig;
42
42
  /**
43
43
  * 加载 Ask 引擎配置(带缓存)
44
+ * v8.3.25+: 优先从 .speccore.yml 读取,回退到 ask.json
44
45
  */
45
46
  export declare function loadAskConfig(): Promise<AskConfig>;
46
47
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ask-config.d.ts","sourceRoot":"","sources":["../../src/core/ask-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;QAC3C,6BAA6B;QAC7B,aAAa,EAAE,MAAM,CAAC;QACtB,+BAA+B;QAC/B,YAAY,EAAE,MAAM,CAAC;QACrB,yBAAyB;QACzB,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe;QACf,YAAY,EAAE,OAAO,CAAC;QACtB,4BAA4B;QAC5B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE;QACL,oCAAoC;QACpC,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,YAAY,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,eAAO,MAAM,kBAAkB,EAAE,SAiChC,CAAC;AAYF;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,CAsBxD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAErD"}
1
+ {"version":3,"file":"ask-config.d.ts","sourceRoot":"","sources":["../../src/core/ask-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;QAC3C,6BAA6B;QAC7B,aAAa,EAAE,MAAM,CAAC;QACtB,+BAA+B;QAC/B,YAAY,EAAE,MAAM,CAAC;QACrB,yBAAyB;QACzB,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe;QACf,YAAY,EAAE,OAAO,CAAC;QACtB,4BAA4B;QAC5B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE;QACL,oCAAoC;QACpC,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,YAAY,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IACnD,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,eAAO,MAAM,kBAAkB,EAAE,SAiChC,CAAC;AAYF;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,CAuCxD;AAiDD;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAErD"}
@@ -5,6 +5,39 @@
5
5
  * 读取优先级:环境变量 > .speccore/config/ask.json > 内置默认值
6
6
  * 支持用户通过配置文件持久化偏好,也支持命令行临时覆盖(--rules)
7
7
  */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
8
41
  Object.defineProperty(exports, "__esModule", { value: true });
9
42
  exports.DEFAULT_ASK_CONFIG = void 0;
10
43
  exports.loadAskConfig = loadAskConfig;
@@ -58,6 +91,7 @@ let configLoadTime = 0;
58
91
  const CONFIG_TTL = 5000; // 5秒内复用缓存
59
92
  /**
60
93
  * 加载 Ask 引擎配置(带缓存)
94
+ * v8.3.25+: 优先从 .speccore.yml 读取,回退到 ask.json
61
95
  */
62
96
  async function loadAskConfig() {
63
97
  const now = Date.now();
@@ -65,9 +99,26 @@ async function loadAskConfig() {
65
99
  return cachedConfig;
66
100
  }
67
101
  let fileConfig = {};
68
- if (await (0, fs_extra_1.pathExists)(CONFIG_PATH)) {
102
+ let source = 'default';
103
+ // v8.3.25+: 优先从 .speccore.yml 统一配置读取
104
+ try {
105
+ const { loadConfig } = await Promise.resolve().then(() => __importStar(require('./unified-config')));
106
+ const unified = await loadConfig();
107
+ if (unified.ask && (unified.ask.llm_providers.length > 0 || unified.ask.routing.mode)) {
108
+ fileConfig = mapUnifiedToAskConfig(unified.ask);
109
+ source = '.speccore.yml';
110
+ }
111
+ }
112
+ catch { /* 静默回退到 ask.json */ }
113
+ // 回退到 ask.json(旧的独立配置)
114
+ if (source === 'default' && (await (0, fs_extra_1.pathExists)(CONFIG_PATH))) {
69
115
  try {
70
116
  fileConfig = (await (0, fs_extra_1.readJson)(CONFIG_PATH));
117
+ // v8.3.25+: 解析环境变量引用(如 apiKey: "${SPECCORE_LLM_KEY}")
118
+ const { resolveEnvVars } = await Promise.resolve().then(() => __importStar(require('./unified-config')));
119
+ const envResult = resolveEnvVars(fileConfig);
120
+ fileConfig = envResult.value;
121
+ source = 'ask.json';
71
122
  }
72
123
  catch (e) {
73
124
  logger_1.logger.warn(`ask-config 读取失败,使用默认值: ${e.message}`);
@@ -79,6 +130,33 @@ async function loadAskConfig() {
79
130
  configLoadTime = now;
80
131
  return cachedConfig;
81
132
  }
133
+ /**
134
+ * 将 .speccore.yml 的 ask 配置映射为 AskConfig(snake_case → camelCase)
135
+ */
136
+ function mapUnifiedToAskConfig(ask) {
137
+ return {
138
+ routing: {
139
+ mode: ask.routing.mode,
140
+ highThreshold: ask.routing.high_threshold,
141
+ lowThreshold: ask.routing.low_threshold,
142
+ autoHostAi: ask.routing.auto_host_ai,
143
+ cacheEnabled: ask.routing.cache_enabled,
144
+ cacheMinHits: ask.routing.cache_min_hits,
145
+ },
146
+ rules: {
147
+ forceHostAi: ask.rules.force_host_ai,
148
+ },
149
+ llmProviders: ask.llm_providers.map((p) => ({
150
+ name: p.name,
151
+ enabled: p.enabled,
152
+ type: p.type,
153
+ endpoint: p.endpoint,
154
+ model: p.model,
155
+ apiKey: p.apiKey,
156
+ priority: p.priority,
157
+ })),
158
+ };
159
+ }
82
160
  /**
83
161
  * 保存 Ask 引擎配置
84
162
  */