soloforge 1.1.2 → 1.2.1

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 (62) hide show
  1. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  2. package/dist/adapters/claude_code/tools.js +8 -0
  3. package/dist/adapters/claude_code/tools.js.map +1 -1
  4. package/dist/bin/soloforge.js +7 -2
  5. package/dist/bin/soloforge.js.map +1 -1
  6. package/dist/engine/audit_verifier.d.ts +52 -0
  7. package/dist/engine/audit_verifier.d.ts.map +1 -0
  8. package/dist/engine/audit_verifier.js +96 -0
  9. package/dist/engine/audit_verifier.js.map +1 -0
  10. package/dist/engine/code_reviewer.d.ts +6 -0
  11. package/dist/engine/code_reviewer.d.ts.map +1 -1
  12. package/dist/engine/code_reviewer.js +73 -3
  13. package/dist/engine/code_reviewer.js.map +1 -1
  14. package/dist/engine/evolver.d.ts +9 -0
  15. package/dist/engine/evolver.d.ts.map +1 -1
  16. package/dist/engine/evolver.js +47 -1
  17. package/dist/engine/evolver.js.map +1 -1
  18. package/dist/engine/exploration.d.ts +13 -0
  19. package/dist/engine/exploration.d.ts.map +1 -1
  20. package/dist/engine/exploration.js +59 -1
  21. package/dist/engine/exploration.js.map +1 -1
  22. package/dist/engine/intent_expander.d.ts.map +1 -1
  23. package/dist/engine/intent_expander.js +10 -5
  24. package/dist/engine/intent_expander.js.map +1 -1
  25. package/dist/engine/io_controller.d.ts +87 -0
  26. package/dist/engine/io_controller.d.ts.map +1 -0
  27. package/dist/engine/io_controller.js +190 -0
  28. package/dist/engine/io_controller.js.map +1 -0
  29. package/dist/engine/knowledge_config_loader.d.ts +28 -0
  30. package/dist/engine/knowledge_config_loader.d.ts.map +1 -0
  31. package/dist/engine/knowledge_config_loader.js +72 -0
  32. package/dist/engine/knowledge_config_loader.js.map +1 -0
  33. package/dist/engine/knowledge_manager.d.ts.map +1 -1
  34. package/dist/engine/knowledge_manager.js +11 -1
  35. package/dist/engine/knowledge_manager.js.map +1 -1
  36. package/dist/engine/llm_gateway.d.ts +96 -0
  37. package/dist/engine/llm_gateway.d.ts.map +1 -0
  38. package/dist/engine/llm_gateway.js +220 -0
  39. package/dist/engine/llm_gateway.js.map +1 -0
  40. package/dist/engine/test_quality.d.ts +15 -1
  41. package/dist/engine/test_quality.d.ts.map +1 -1
  42. package/dist/engine/test_quality.js +235 -23
  43. package/dist/engine/test_quality.js.map +1 -1
  44. package/dist/engine/workspace_resumer.d.ts +37 -0
  45. package/dist/engine/workspace_resumer.d.ts.map +1 -0
  46. package/dist/engine/workspace_resumer.js +82 -0
  47. package/dist/engine/workspace_resumer.js.map +1 -0
  48. package/dist/knowledge/writer.d.ts +2 -0
  49. package/dist/knowledge/writer.d.ts.map +1 -1
  50. package/dist/knowledge/writer.js +12 -4
  51. package/dist/knowledge/writer.js.map +1 -1
  52. package/dist/types.d.ts +2 -0
  53. package/dist/types.d.ts.map +1 -1
  54. package/package.json +1 -1
  55. package/templates/knowledge/checklists/session_recovery.md +37 -0
  56. package/templates/knowledge/patterns/core/authority.md +38 -0
  57. package/templates/knowledge/patterns/core/concurrency_lock.md +36 -0
  58. package/templates/knowledge/patterns/core/decision_gateway.md +33 -0
  59. package/templates/knowledge/patterns/core/developer_constitution.md +39 -0
  60. package/templates/knowledge/patterns/core/mutation_audit.md +30 -0
  61. package/templates/knowledge/patterns/core/streaming_protocol.md +36 -0
  62. package/templates/knowledge/templates/review_summary.md +46 -0
@@ -0,0 +1,96 @@
1
+ /**
2
+ * LLM 统一网关 — 控制流零 AI 依赖,决策节点强 AI 依赖。
3
+ *
4
+ * 职责:
5
+ * 1. 定义 AI 依赖边界: 明确哪些操作需要 LLM 算力,哪些可以本地完成
6
+ * 2. Token 消耗监控: 按 operation_type 估算和追踪 Token 用量
7
+ * 3. 硬熔断: 超过 Token 预算上限时拦截后续 AI 调用
8
+ * 4. 调用审计: 记录每次 AI 调用的类型、Token 估算和耗时
9
+ * 5. 单任务阈值: 单次任务 Token 支出超过阈值时强制熔断
10
+ * 6. 流式心跳: 重型推演(>10s)期间每5秒发送进度,防止客户端超时断连
11
+ */
12
+ /** AI 操作类型分级 */
13
+ export type AIOperationTier = "light" | "medium" | "heavy";
14
+ /** AI 依赖的操作类型 */
15
+ export type AIOperationType = "intent_refinement" | "solution_brainstorm" | "verification_reasoning" | "code_generation" | "test_generation" | "review_deep_analysis" | "debug_analysis";
16
+ /** 操作类型配置: 级别 + Token 估算 */
17
+ interface OperationProfile {
18
+ tier: AIOperationTier;
19
+ estimated_tokens: number;
20
+ description: string;
21
+ }
22
+ /** 调用审计记录 */
23
+ export interface GatewayAuditEntry {
24
+ operation: AIOperationType;
25
+ estimated_tokens: number;
26
+ timestamp: string;
27
+ blocked: boolean;
28
+ task_id?: string;
29
+ }
30
+ /** 网关状态快照 */
31
+ export interface GatewayStatus {
32
+ budget_total: number;
33
+ budget_used: number;
34
+ budget_remaining: number;
35
+ usage_ratio: number;
36
+ circuit_open: boolean;
37
+ call_count: number;
38
+ blocked_count: number;
39
+ task_tokens_used: number;
40
+ audit_log: GatewayAuditEntry[];
41
+ }
42
+ /** 心跳进度回调 */
43
+ export type HeartbeatCallback = (progress: {
44
+ elapsed_ms: number;
45
+ tokens_used: number;
46
+ operation: AIOperationType;
47
+ message: string;
48
+ }) => void;
49
+ export declare class LLMGateway {
50
+ private budgetTotal;
51
+ private budgetUsed;
52
+ private taskBudget;
53
+ private taskTokensUsed;
54
+ private currentTaskId;
55
+ private callCount;
56
+ private blockedCount;
57
+ private auditLog;
58
+ private circuitOpen;
59
+ private heartbeatTimer;
60
+ private heartbeatCallback;
61
+ private operationStart;
62
+ private currentOperation;
63
+ private config;
64
+ constructor(budget?: number, taskBudget?: number);
65
+ /** 设置心跳回调(用于 stdio 输出进度) */
66
+ setHeartbeatCallback(cb: HeartbeatCallback): void;
67
+ /** 开始新任务的 Token 计量 */
68
+ beginTask(taskId: string): void;
69
+ /** 结束任务计量 */
70
+ endTask(): void;
71
+ request(operation: AIOperationType, taskId?: string): {
72
+ allowed: boolean;
73
+ estimated_tokens: number;
74
+ remaining_budget: number;
75
+ remaining_task_budget: number;
76
+ reason?: string;
77
+ };
78
+ /** 置信度闸口: 低于阈值禁止执行代码,必须调用 sf_brainstorm */
79
+ confidenceGate(confidence: number): {
80
+ allowed: boolean;
81
+ threshold: number;
82
+ reason?: string;
83
+ };
84
+ /** 标记操作完成,停止心跳 */
85
+ completeOperation(): void;
86
+ reportActualUsage(operation: AIOperationType, actualTokens: number): void;
87
+ getStatus(): GatewayStatus;
88
+ reset(budget?: number): void;
89
+ static isLocalOperation(op: string): boolean;
90
+ static isAIOperation(op: AIOperationType): boolean;
91
+ static getProfile(op: AIOperationType): OperationProfile;
92
+ private startHeartbeat;
93
+ private stopHeartbeat;
94
+ }
95
+ export {};
96
+ //# sourceMappingURL=llm_gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm_gateway.d.ts","sourceRoot":"","sources":["../../src/engine/llm_gateway.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AAIH,gBAAgB;AAChB,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,iBAAiB;AACjB,MAAM,MAAM,eAAe,GACvB,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,iBAAiB,GACjB,iBAAiB,GACjB,sBAAsB,GACtB,gBAAgB,CAAC;AAErB,4BAA4B;AAC5B,UAAU,gBAAgB;IACxB,IAAI,EAAE,eAAe,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,aAAa;AACb,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,eAAe,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,aAAa;AACb,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,aAAa;AACb,MAAM,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,KAAK,IAAI,CAAC;AAqCX,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,gBAAgB,CAAgC;IAExD,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAKhD,4BAA4B;IAC5B,oBAAoB,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAIjD,sBAAsB;IACtB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,aAAa;IACb,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;QACpD,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;IAuED,2CAA2C;IAC3C,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAY5F,kBAAkB;IAClB,iBAAiB,IAAI,IAAI;IAKzB,iBAAiB,CAAC,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAezE,SAAS,IAAI,aAAa;IAc1B,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAW5B,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS5C,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO;IAIlD,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,eAAe,GAAG,gBAAgB;IAMxD,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,aAAa;CAMtB"}
@@ -0,0 +1,220 @@
1
+ import { loadKnowledgeConfig, extractNumberRule } from "./knowledge_config_loader.js";
2
+ // ── 操作配置表 ──
3
+ const OPERATION_PROFILES = {
4
+ intent_refinement: { tier: "medium", estimated_tokens: 2000, description: "意图理解深化" },
5
+ solution_brainstorm: { tier: "heavy", estimated_tokens: 4000, description: "方案脑暴推演" },
6
+ verification_reasoning: { tier: "heavy", estimated_tokens: 3000, description: "复杂验证推理" },
7
+ code_generation: { tier: "heavy", estimated_tokens: 5000, description: "代码生成" },
8
+ test_generation: { tier: "medium", estimated_tokens: 3000, description: "测试用例生成" },
9
+ review_deep_analysis: { tier: "heavy", estimated_tokens: 4000, description: "深度审查分析" },
10
+ debug_analysis: { tier: "medium", estimated_tokens: 2500, description: "排障推理" },
11
+ };
12
+ /** 从知识库 decision_gateway.md 读取阈值,文件不存在时使用硬编码兜底 */
13
+ function loadGatewayConfig(projectPath) {
14
+ const config = loadKnowledgeConfig("patterns/core/decision_gateway.md", projectPath);
15
+ const body = config?.body ?? "";
16
+ return {
17
+ budget_total: extractNumberRule(body, "Budget_Total") ?? 100_000,
18
+ task_budget: extractNumberRule(body, "Task_Budget") ?? 30_000,
19
+ circuit_breaker_ratio: extractNumberRule(body, "Circuit_Breaker_Ratio") ?? 0.9,
20
+ heartbeat_interval: extractNumberRule(body, "Heartbeat_Interval") ?? 5000,
21
+ confidence_threshold: extractNumberRule(body, "Confidence_Threshold") ?? 0.95,
22
+ };
23
+ }
24
+ const DEFAULT_CONFIG = loadGatewayConfig();
25
+ // ── 网关核心 ──
26
+ export class LLMGateway {
27
+ budgetTotal;
28
+ budgetUsed = 0;
29
+ taskBudget;
30
+ taskTokensUsed = 0;
31
+ currentTaskId = null;
32
+ callCount = 0;
33
+ blockedCount = 0;
34
+ auditLog = [];
35
+ circuitOpen = false;
36
+ heartbeatTimer = null;
37
+ heartbeatCallback = null;
38
+ operationStart = 0;
39
+ currentOperation = null;
40
+ config = DEFAULT_CONFIG;
41
+ constructor(budget, taskBudget) {
42
+ this.budgetTotal = budget ?? this.config.budget_total;
43
+ this.taskBudget = taskBudget ?? this.config.task_budget;
44
+ }
45
+ /** 设置心跳回调(用于 stdio 输出进度) */
46
+ setHeartbeatCallback(cb) {
47
+ this.heartbeatCallback = cb;
48
+ }
49
+ /** 开始新任务的 Token 计量 */
50
+ beginTask(taskId) {
51
+ this.currentTaskId = taskId;
52
+ this.taskTokensUsed = 0;
53
+ }
54
+ /** 结束任务计量 */
55
+ endTask() {
56
+ this.currentTaskId = null;
57
+ this.taskTokensUsed = 0;
58
+ this.stopHeartbeat();
59
+ }
60
+ request(operation, taskId) {
61
+ const profile = OPERATION_PROFILES[operation];
62
+ const tid = taskId ?? this.currentTaskId ?? undefined;
63
+ const entry = {
64
+ operation,
65
+ estimated_tokens: profile.estimated_tokens,
66
+ timestamp: new Date().toISOString(),
67
+ blocked: false,
68
+ task_id: tid,
69
+ };
70
+ // 单任务阈值检查
71
+ if (this.taskTokensUsed + profile.estimated_tokens > this.taskBudget) {
72
+ this.blockedCount++;
73
+ entry.blocked = true;
74
+ this.auditLog.push(entry);
75
+ return {
76
+ allowed: false,
77
+ estimated_tokens: profile.estimated_tokens,
78
+ remaining_budget: this.budgetTotal - this.budgetUsed,
79
+ remaining_task_budget: this.taskBudget - this.taskTokensUsed,
80
+ reason: `单任务 Token 阈值触发: 当前任务已使用 ${this.taskTokensUsed}/${this.taskBudget},${profile.description} 需要 ~${profile.estimated_tokens}。建议拆分任务或减少范围`,
81
+ };
82
+ }
83
+ // 全局熔断检查
84
+ if (this.circuitOpen || (this.budgetUsed / this.budgetTotal) >= this.config.circuit_breaker_ratio) {
85
+ this.circuitOpen = true;
86
+ this.blockedCount++;
87
+ entry.blocked = true;
88
+ this.auditLog.push(entry);
89
+ return {
90
+ allowed: false,
91
+ estimated_tokens: profile.estimated_tokens,
92
+ remaining_budget: this.budgetTotal - this.budgetUsed,
93
+ remaining_task_budget: this.taskBudget - this.taskTokensUsed,
94
+ reason: `Token 预告警: 已使用 ${this.budgetUsed}/${this.budgetTotal}(${((this.budgetUsed / this.budgetTotal) * 100).toFixed(0)}%)。${profile.description} 需要 ~${profile.estimated_tokens} Token,超出安全阈值`,
95
+ };
96
+ }
97
+ if (this.budgetUsed + profile.estimated_tokens > this.budgetTotal) {
98
+ this.blockedCount++;
99
+ entry.blocked = true;
100
+ this.auditLog.push(entry);
101
+ return {
102
+ allowed: false,
103
+ estimated_tokens: profile.estimated_tokens,
104
+ remaining_budget: this.budgetTotal - this.budgetUsed,
105
+ remaining_task_budget: this.taskBudget - this.taskTokensUsed,
106
+ reason: `Token 预算不足: 剩余 ${this.budgetTotal - this.budgetUsed},需要 ~${profile.estimated_tokens}`,
107
+ };
108
+ }
109
+ this.budgetUsed += profile.estimated_tokens;
110
+ this.taskTokensUsed += profile.estimated_tokens;
111
+ this.callCount++;
112
+ this.auditLog.push(entry);
113
+ // 重型操作启动心跳
114
+ if (profile.tier === "heavy") {
115
+ this.startHeartbeat(operation);
116
+ }
117
+ return {
118
+ allowed: true,
119
+ estimated_tokens: profile.estimated_tokens,
120
+ remaining_budget: this.budgetTotal - this.budgetUsed,
121
+ remaining_task_budget: this.taskBudget - this.taskTokensUsed,
122
+ };
123
+ }
124
+ /** 置信度闸口: 低于阈值禁止执行代码,必须调用 sf_brainstorm */
125
+ confidenceGate(confidence) {
126
+ const threshold = this.config.confidence_threshold;
127
+ if (confidence < threshold) {
128
+ return {
129
+ allowed: false,
130
+ threshold,
131
+ reason: `置信度 ${confidence.toFixed(2)} 低于阈值 ${threshold},禁止直接输出执行代码,必须调用 sf_brainstorm 展示三轨方案`,
132
+ };
133
+ }
134
+ return { allowed: true, threshold };
135
+ }
136
+ /** 标记操作完成,停止心跳 */
137
+ completeOperation() {
138
+ this.stopHeartbeat();
139
+ this.currentOperation = null;
140
+ }
141
+ reportActualUsage(operation, actualTokens) {
142
+ const profile = OPERATION_PROFILES[operation];
143
+ const diff = actualTokens - profile.estimated_tokens;
144
+ if (diff > 0) {
145
+ this.budgetUsed += diff;
146
+ this.taskTokensUsed += diff;
147
+ if ((this.budgetUsed / this.budgetTotal) >= this.config.circuit_breaker_ratio) {
148
+ this.circuitOpen = true;
149
+ }
150
+ }
151
+ else {
152
+ this.budgetUsed = Math.max(0, this.budgetUsed + diff);
153
+ this.taskTokensUsed = Math.max(0, this.taskTokensUsed + diff);
154
+ }
155
+ }
156
+ getStatus() {
157
+ return {
158
+ budget_total: this.budgetTotal,
159
+ budget_used: this.budgetUsed,
160
+ budget_remaining: this.budgetTotal - this.budgetUsed,
161
+ usage_ratio: this.budgetUsed / this.budgetTotal,
162
+ circuit_open: this.circuitOpen,
163
+ call_count: this.callCount,
164
+ blocked_count: this.blockedCount,
165
+ task_tokens_used: this.taskTokensUsed,
166
+ audit_log: [...this.auditLog],
167
+ };
168
+ }
169
+ reset(budget) {
170
+ this.budgetTotal = budget ?? this.config.budget_total;
171
+ this.budgetUsed = 0;
172
+ this.callCount = 0;
173
+ this.blockedCount = 0;
174
+ this.auditLog = [];
175
+ this.circuitOpen = false;
176
+ this.taskTokensUsed = 0;
177
+ this.stopHeartbeat();
178
+ }
179
+ static isLocalOperation(op) {
180
+ const LOCAL_OPS = [
181
+ "classify", "scope_resolve", "knowledge_match", "pattern_extract",
182
+ "drift_detect", "mutation_test", "coverage_scan", "dependency_scan",
183
+ "migration_check", "contract_check", "debt_scan", "build_run",
184
+ ];
185
+ return LOCAL_OPS.includes(op);
186
+ }
187
+ static isAIOperation(op) {
188
+ return op in OPERATION_PROFILES;
189
+ }
190
+ static getProfile(op) {
191
+ return OPERATION_PROFILES[op];
192
+ }
193
+ // ── 流式心跳 ──
194
+ startHeartbeat(operation) {
195
+ this.stopHeartbeat();
196
+ this.operationStart = Date.now();
197
+ this.currentOperation = operation;
198
+ if (!this.heartbeatCallback)
199
+ return;
200
+ this.heartbeatTimer = setInterval(() => {
201
+ if (!this.heartbeatCallback || !this.currentOperation)
202
+ return;
203
+ const elapsed = Date.now() - this.operationStart;
204
+ const profile = OPERATION_PROFILES[this.currentOperation];
205
+ this.heartbeatCallback({
206
+ elapsed_ms: elapsed,
207
+ tokens_used: this.taskTokensUsed,
208
+ operation: this.currentOperation,
209
+ message: `[SoloForge Heartbeat] ${profile.description} 执行中... 已耗时 ${(elapsed / 1000).toFixed(0)}s,当前任务已用 ${this.taskTokensUsed}/${this.taskBudget} Token`,
210
+ });
211
+ }, this.config.heartbeat_interval);
212
+ }
213
+ stopHeartbeat() {
214
+ if (this.heartbeatTimer) {
215
+ clearInterval(this.heartbeatTimer);
216
+ this.heartbeatTimer = null;
217
+ }
218
+ }
219
+ }
220
+ //# sourceMappingURL=llm_gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm_gateway.js","sourceRoot":"","sources":["../../src/engine/llm_gateway.ts"],"names":[],"mappings":"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"}
@@ -12,5 +12,19 @@ import type { TestQualityReport } from "../types.js";
12
12
  * @param sourceContent - 可选的被测源码内容(用于变异测试)
13
13
  * @returns 测试质量报告,包含总分(0-100)、各项检查结果和改进建议列表
14
14
  */
15
- export declare function analyzeTestQuality(testContent: string, filename: string, sourceContent?: string): TestQualityReport;
15
+ export declare function analyzeTestQuality(testContent: string, filename: string, sourceContent?: string, coverageMap?: CoverageMap, sourceFilePath?: string): TestQualityReport;
16
+ /** lcov 报告解析结果: 文件路径 → 已覆盖行号集合 */
17
+ export type CoverageMap = Map<string, Set<number>>;
18
+ /**
19
+ * 解析 lcov.info 报告,提取每个文件的已覆盖行号。
20
+ * lcov 格式:
21
+ * SF:path/to/file.ts
22
+ * DA:10,1
23
+ * DA:25,0
24
+ * end_of_record
25
+ * DA 行中第二个字段 > 0 表示该行被执行过(已覆盖)。
26
+ * @param lcovContent - lcov.info 文件内容
27
+ * @returns 覆盖率映射(文件路径 → 已覆盖行号集合)
28
+ */
29
+ export declare function parseLcov(lcovContent: string): CoverageMap;
16
30
  //# sourceMappingURL=test_quality.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test_quality.d.ts","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,iBAAiB,CAqEnB"}
1
+ {"version":3,"file":"test_quality.d.ts","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,WAAW,EACzB,cAAc,CAAC,EAAE,MAAM,GACtB,iBAAiB,CAuEnB;AAidD,kCAAkC;AAClC,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAyB1D"}