soloforge 1.0.0 → 1.1.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.
- package/README.md +4 -1
- package/dist/adapters/claude_code/claude_md.d.ts +1 -2
- package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
- package/dist/adapters/claude_code/claude_md.js +2 -76
- package/dist/adapters/claude_code/claude_md.js.map +1 -1
- package/dist/adapters/claude_code/server.d.ts +16 -0
- package/dist/adapters/claude_code/server.d.ts.map +1 -1
- package/dist/adapters/claude_code/server.js +17 -1
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts +32 -1
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +65 -30
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/codex/codex_config.d.ts +3 -0
- package/dist/adapters/codex/codex_config.d.ts.map +1 -0
- package/dist/adapters/codex/codex_config.js +51 -0
- package/dist/adapters/codex/codex_config.js.map +1 -0
- package/dist/adapters/codex/codex_rules.d.ts +2 -0
- package/dist/adapters/codex/codex_rules.d.ts.map +1 -0
- package/dist/adapters/codex/codex_rules.js +5 -0
- package/dist/adapters/codex/codex_rules.js.map +1 -0
- package/dist/adapters/shared/workflow_template.d.ts +3 -0
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -0
- package/dist/adapters/shared/workflow_template.js +78 -0
- package/dist/adapters/shared/workflow_template.js.map +1 -0
- package/dist/adapters/trae/trae_rules.d.ts +1 -2
- package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
- package/dist/adapters/trae/trae_rules.js +2 -75
- package/dist/adapters/trae/trae_rules.js.map +1 -1
- package/dist/bin/soloforge.js +171 -22
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/change_coordinator.d.ts +20 -5
- package/dist/engine/change_coordinator.d.ts.map +1 -1
- package/dist/engine/change_coordinator.js +36 -22
- package/dist/engine/change_coordinator.js.map +1 -1
- package/dist/engine/classifier.d.ts +7 -0
- package/dist/engine/classifier.d.ts.map +1 -1
- package/dist/engine/classifier.js +75 -3
- package/dist/engine/classifier.js.map +1 -1
- package/dist/engine/code_reviewer.d.ts +37 -1
- package/dist/engine/code_reviewer.d.ts.map +1 -1
- package/dist/engine/code_reviewer.js +126 -24
- package/dist/engine/code_reviewer.js.map +1 -1
- package/dist/engine/confidence_scorer.d.ts +21 -0
- package/dist/engine/confidence_scorer.d.ts.map +1 -1
- package/dist/engine/confidence_scorer.js +19 -6
- package/dist/engine/confidence_scorer.js.map +1 -1
- package/dist/engine/contract_guard.d.ts +23 -0
- package/dist/engine/contract_guard.d.ts.map +1 -1
- package/dist/engine/contract_guard.js +152 -43
- package/dist/engine/contract_guard.js.map +1 -1
- package/dist/engine/convention_detector.d.ts +20 -0
- package/dist/engine/convention_detector.d.ts.map +1 -1
- package/dist/engine/convention_detector.js +19 -1
- package/dist/engine/convention_detector.js.map +1 -1
- package/dist/engine/debt_reporter.d.ts +5 -0
- package/dist/engine/debt_reporter.d.ts.map +1 -1
- package/dist/engine/debt_reporter.js +30 -6
- package/dist/engine/debt_reporter.js.map +1 -1
- package/dist/engine/debt_tracker.d.ts +52 -0
- package/dist/engine/debt_tracker.d.ts.map +1 -1
- package/dist/engine/debt_tracker.js +66 -1
- package/dist/engine/debt_tracker.js.map +1 -1
- package/dist/engine/debugger.d.ts +9 -0
- package/dist/engine/debugger.d.ts.map +1 -1
- package/dist/engine/debugger.js +112 -20
- package/dist/engine/debugger.js.map +1 -1
- package/dist/engine/delivery.d.ts +27 -0
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +67 -13
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/dependency_scanner.d.ts +5 -8
- package/dist/engine/dependency_scanner.d.ts.map +1 -1
- package/dist/engine/dependency_scanner.js +46 -29
- package/dist/engine/dependency_scanner.js.map +1 -1
- package/dist/engine/evolver.d.ts +54 -0
- package/dist/engine/evolver.d.ts.map +1 -1
- package/dist/engine/evolver.js +159 -6
- package/dist/engine/evolver.js.map +1 -1
- package/dist/engine/exploration.d.ts +114 -0
- package/dist/engine/exploration.d.ts.map +1 -0
- package/dist/engine/exploration.js +414 -0
- package/dist/engine/exploration.js.map +1 -0
- package/dist/engine/failure_classifier.d.ts +28 -0
- package/dist/engine/failure_classifier.d.ts.map +1 -1
- package/dist/engine/failure_classifier.js +51 -5
- package/dist/engine/failure_classifier.js.map +1 -1
- package/dist/engine/git_deps.d.ts +29 -0
- package/dist/engine/git_deps.d.ts.map +1 -1
- package/dist/engine/git_deps.js +1 -0
- package/dist/engine/git_deps.js.map +1 -1
- package/dist/engine/impact_analyzer.d.ts +17 -0
- package/dist/engine/impact_analyzer.d.ts.map +1 -1
- package/dist/engine/impact_analyzer.js +76 -4
- package/dist/engine/impact_analyzer.js.map +1 -1
- package/dist/engine/intent_expander.d.ts +58 -0
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +173 -1
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/migration_guard.d.ts +6 -0
- package/dist/engine/migration_guard.d.ts.map +1 -1
- package/dist/engine/migration_guard.js +26 -7
- package/dist/engine/migration_guard.js.map +1 -1
- package/dist/engine/observability.d.ts +31 -7
- package/dist/engine/observability.d.ts.map +1 -1
- package/dist/engine/observability.js +88 -28
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/onboarding.d.ts +41 -1
- package/dist/engine/onboarding.d.ts.map +1 -1
- package/dist/engine/onboarding.js +83 -8
- package/dist/engine/onboarding.js.map +1 -1
- package/dist/engine/scaffolder.d.ts +10 -0
- package/dist/engine/scaffolder.d.ts.map +1 -1
- package/dist/engine/scaffolder.js +55 -10
- package/dist/engine/scaffolder.js.map +1 -1
- package/dist/engine/scope_controller.d.ts +13 -0
- package/dist/engine/scope_controller.d.ts.map +1 -1
- package/dist/engine/scope_controller.js +76 -12
- package/dist/engine/scope_controller.js.map +1 -1
- package/dist/engine/task_context.d.ts +124 -0
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +155 -7
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/task_planner.d.ts +17 -0
- package/dist/engine/task_planner.d.ts.map +1 -1
- package/dist/engine/task_planner.js +51 -4
- package/dist/engine/task_planner.js.map +1 -1
- package/dist/engine/team_awareness.d.ts +17 -0
- package/dist/engine/team_awareness.d.ts.map +1 -1
- package/dist/engine/team_awareness.js +29 -11
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/test_generator.d.ts +5 -4
- package/dist/engine/test_generator.d.ts.map +1 -1
- package/dist/engine/test_generator.js +22 -5
- package/dist/engine/test_generator.js.map +1 -1
- package/dist/engine/test_quality.d.ts +11 -4
- package/dist/engine/test_quality.d.ts.map +1 -1
- package/dist/engine/test_quality.js +171 -14
- package/dist/engine/test_quality.js.map +1 -1
- package/dist/engine/verifier.d.ts +41 -0
- package/dist/engine/verifier.d.ts.map +1 -1
- package/dist/engine/verifier.js +110 -1
- package/dist/engine/verifier.js.map +1 -1
- package/dist/git/operations.d.ts +1 -0
- package/dist/git/operations.d.ts.map +1 -1
- package/dist/git/operations.js +3 -0
- package/dist/git/operations.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge/index_manager.d.ts +7 -1
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +112 -37
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/knowledge/loader.d.ts +31 -0
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +102 -8
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/types.d.ts +608 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/knowledge/acceptance_templates//346/212/200/346/234/257/351/200/211/345/236/213/351/252/214/346/224/266/346/270/205/345/215/225.md +19 -0
- package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +4 -0
- package/templates/knowledge/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +4 -1
- package/templates/knowledge/procedures//350/207/252/344/270/273/351/200/211/345/236/213/346/265/201/347/250/213.md +34 -0
- package/templates/knowledge/review_rules//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +66 -0
- package/templates/scaffolds/react/Form.tsx.hbs +9 -1
- package/templates/scaffolds/react/List.tsx.hbs +10 -1
- package/templates/scaffolds/react/Page.tsx.hbs +4 -1
- package/templates/scaffolds/react/service.ts.hbs +29 -0
- package/templates/scaffolds/react/types.ts.hbs +7 -1
- package/templates/scaffolds/react/use{{ModuleName}}.ts.hbs +34 -2
- package/templates/scaffolds/spring-boot/Controller.java.hbs +27 -0
- package/templates/scaffolds/spring-boot/DTO.java.hbs +7 -1
- package/templates/scaffolds/spring-boot/Entity.java.hbs +11 -1
- package/templates/scaffolds/spring-boot/ErrorCode.java.hbs +13 -1
- package/templates/scaffolds/spring-boot/Mapper.java.hbs +4 -1
- package/templates/scaffolds/spring-boot/PageResponse.java.hbs +24 -1
- package/templates/scaffolds/spring-boot/Service.java.hbs +32 -0
- package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +23 -5
- package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +7 -1
|
@@ -2,9 +2,18 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import fss from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import matter from "gray-matter";
|
|
5
|
+
/**
|
|
6
|
+
* 检测项目代码惯例。
|
|
7
|
+
* @description 优先加载项目中配置的惯例文件(支持 YAML front-matter 格式),
|
|
8
|
+
* 然后逐个分析源文件,识别特定的编码模式。最多返回 10 条惯例。
|
|
9
|
+
* @param filePaths - 待分析的文件路径列表
|
|
10
|
+
* @param projectPath - 项目根目录路径(用于解析相对路径)
|
|
11
|
+
* @param conventionsFile - 惯例配置文件路径(可选)
|
|
12
|
+
* @returns 检测到的惯例列表
|
|
13
|
+
*/
|
|
5
14
|
export async function detectConventions(filePaths, projectPath, conventionsFile) {
|
|
6
15
|
const conventions = [];
|
|
7
|
-
//
|
|
16
|
+
// 优先加载项目中配置的惯例文件(YAML front-matter 格式,conventions 字段为数组)
|
|
8
17
|
if (conventionsFile) {
|
|
9
18
|
const convPath = path.resolve(projectPath, conventionsFile);
|
|
10
19
|
if (fss.existsSync(convPath)) {
|
|
@@ -44,6 +53,15 @@ export async function detectConventions(filePaths, projectPath, conventionsFile)
|
|
|
44
53
|
}
|
|
45
54
|
return conventions;
|
|
46
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* 分析单个文件,检测其中的编码惯例。
|
|
58
|
+
* @description 根据文件类型使用不同的检测策略:
|
|
59
|
+
* - Java 文件:检测缓存字段模式、事务注解用法、ServiceImpl 命名规范
|
|
60
|
+
* - TypeScript/React 文件:检测默认导出、Props interface、CSS-in-JS 方案
|
|
61
|
+
* @param content - 文件内容文本
|
|
62
|
+
* @param filePath - 文件路径(用于判断文件类型)
|
|
63
|
+
* @returns 从该文件中检测到的惯例列表
|
|
64
|
+
*/
|
|
47
65
|
function analyzeFile(content, filePath) {
|
|
48
66
|
const conventions = [];
|
|
49
67
|
// 检测 Spring 惯例
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convention_detector.js","sourceRoot":"","sources":["../../src/engine/convention_detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,GAAG,MAAM,SAAS,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"convention_detector.js","sourceRoot":"","sources":["../../src/engine/convention_detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { DebtTracker } from "./debt_tracker.js";
|
|
2
2
|
import type { DebtReport } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* 生成完整的技术债务报告,包含分组统计、趋势数据和优先级排序。
|
|
5
|
+
* @param tracker - 技术债务追踪器实例
|
|
6
|
+
* @returns 债务报告,包含总数、分类统计、严重程度分布、最久未解决天数、趋势和中文摘要
|
|
7
|
+
*/
|
|
3
8
|
export declare function generateDebtReport(tracker: DebtTracker): Promise<DebtReport>;
|
|
4
9
|
//# sourceMappingURL=debt_reporter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debt_reporter.d.ts","sourceRoot":"","sources":["../../src/engine/debt_reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"debt_reporter.d.ts","sourceRoot":"","sources":["../../src/engine/debt_reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,aAAa,CAAC;AA4CxD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA0DlF"}
|
|
@@ -1,38 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 技术债务报告生成模块 — 基于债务追踪器数据,生成聚合统计报告。
|
|
3
|
+
* 包括按类别/严重程度分组、最久未解决天数、趋势分析和优先级排序。
|
|
4
|
+
*/
|
|
5
|
+
/** 严重程度权重映射,用于优先级评分 */
|
|
1
6
|
const SEVERITY_SCORE = {
|
|
2
7
|
critical: 4,
|
|
3
8
|
warning: 3,
|
|
4
9
|
info: 1,
|
|
5
10
|
};
|
|
11
|
+
/** 影响程度权重映射,用于优先级评分 */
|
|
6
12
|
const IMPACT_SCORE = {
|
|
7
13
|
high: 3,
|
|
8
14
|
medium: 2,
|
|
9
15
|
low: 1,
|
|
10
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* 计算两个 ISO 日期字符串之间的天数差。
|
|
19
|
+
* @param a - 起始日期字符串(ISO 格式)
|
|
20
|
+
* @param b - 结束日期字符串(ISO 格式)
|
|
21
|
+
* @returns 间隔天数,最小值为 0
|
|
22
|
+
*/
|
|
11
23
|
function daysBetween(a, b) {
|
|
12
24
|
const msPerDay = 86400_000;
|
|
25
|
+
// 向下取整并确保不返回负值
|
|
13
26
|
return Math.max(0, Math.floor((Date.parse(b) - Date.parse(a)) / msPerDay));
|
|
14
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* 计算单条债务的优先级评分。分数 = 严重程度权重 x 影响程度权重。
|
|
30
|
+
* @param item - 债务条目
|
|
31
|
+
* @returns 优先级评分(1~12,越高越紧急)
|
|
32
|
+
*/
|
|
15
33
|
function computePriorityScore(item) {
|
|
16
34
|
const sev = SEVERITY_SCORE[item.severity] ?? 1;
|
|
17
35
|
const imp = IMPACT_SCORE[item.impact ?? "medium"];
|
|
18
36
|
return sev * imp;
|
|
19
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* 生成完整的技术债务报告,包含分组统计、趋势数据和优先级排序。
|
|
40
|
+
* @param tracker - 技术债务追踪器实例
|
|
41
|
+
* @returns 债务报告,包含总数、分类统计、严重程度分布、最久未解决天数、趋势和中文摘要
|
|
42
|
+
*/
|
|
20
43
|
export async function generateDebtReport(tracker) {
|
|
21
44
|
const openItems = await tracker.listOpen();
|
|
22
|
-
//
|
|
45
|
+
// 未解决的债务总数
|
|
23
46
|
const total_open = openItems.length;
|
|
24
|
-
//
|
|
47
|
+
// 按类别分组统计
|
|
25
48
|
const by_category = {};
|
|
26
49
|
for (const item of openItems) {
|
|
27
50
|
const cat = item.category ?? "other";
|
|
28
51
|
by_category[cat] = (by_category[cat] ?? 0) + 1;
|
|
29
52
|
}
|
|
30
|
-
//
|
|
53
|
+
// 按严重程度分组统计
|
|
31
54
|
const by_severity = {};
|
|
32
55
|
for (const item of openItems) {
|
|
33
56
|
by_severity[item.severity] = (by_severity[item.severity] ?? 0) + 1;
|
|
34
57
|
}
|
|
35
|
-
//
|
|
58
|
+
// 计算最久未解决的债务天数
|
|
36
59
|
let oldest_debt_days = 0;
|
|
37
60
|
const now = new Date().toISOString();
|
|
38
61
|
for (const item of openItems) {
|
|
@@ -40,12 +63,13 @@ export async function generateDebtReport(tracker) {
|
|
|
40
63
|
if (days > oldest_debt_days)
|
|
41
64
|
oldest_debt_days = days;
|
|
42
65
|
}
|
|
43
|
-
//
|
|
66
|
+
// 获取近 30 天的债务增减趋势
|
|
44
67
|
const trend_30d = await tracker.getTrend(30);
|
|
68
|
+
// 按优先级评分降序排列,取前 5 条作为最高优先级条目
|
|
45
69
|
// Top priority items (sorted by severity * impact, top 5)
|
|
46
70
|
const sorted = [...openItems].sort((a, b) => computePriorityScore(b) - computePriorityScore(a));
|
|
47
71
|
const top_priority = sorted.slice(0, 5);
|
|
48
|
-
//
|
|
72
|
+
// 生成中文摘要
|
|
49
73
|
const criticalCount = by_severity["critical"] ?? 0;
|
|
50
74
|
const warningCount = by_severity["warning"] ?? 0;
|
|
51
75
|
const infoCount = by_severity["info"] ?? 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debt_reporter.js","sourceRoot":"","sources":["../../src/engine/debt_reporter.ts"],"names":[],"mappings":"AAGA,MAAM,cAAc,GAA2B;IAC7C,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,MAAM,QAAQ,GAAG,SAAS,CAAC;IAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAc;IAC1C,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;IAClD,OAAO,GAAG,GAAG,GAAG,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAoB;IAC3D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;IAE3C,
|
|
1
|
+
{"version":3,"file":"debt_reporter.js","sourceRoot":"","sources":["../../src/engine/debt_reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,72 @@
|
|
|
1
1
|
import type { ReviewFinding, DebtItem } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 技术债务追踪器 — 负责债务的增删改查、统计聚合与过期清理。
|
|
4
|
+
* 债务数据存储在 `{projectPath}/.soloforge/state/debt/` 目录下。
|
|
5
|
+
*/
|
|
2
6
|
export declare class DebtTracker {
|
|
3
7
|
private debtDir;
|
|
8
|
+
/**
|
|
9
|
+
* 初始化债务追踪器。
|
|
10
|
+
* @param projectPath - 项目根目录路径
|
|
11
|
+
*/
|
|
4
12
|
constructor(projectPath: string);
|
|
13
|
+
/** 确保债务存储目录存在,不存在则递归创建 */
|
|
5
14
|
ensureDir(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* 将代码审查发现记录为一条新的技术债务。
|
|
17
|
+
* 使用原子写入(先写临时文件再 rename)保证数据一致性。
|
|
18
|
+
* @param finding - 代码审查发现结果
|
|
19
|
+
* @param taskId - 关联的任务 ID
|
|
20
|
+
* @returns 新创建的债务条目 ID
|
|
21
|
+
*/
|
|
6
22
|
recordDebt(finding: ReviewFinding, taskId: string): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* 列出所有状态为 open 的债务条目,按发现时间升序排列。
|
|
25
|
+
* @returns 未解决的债务条目列表
|
|
26
|
+
*/
|
|
7
27
|
listOpen(): Promise<DebtItem[]>;
|
|
28
|
+
/** 将指定债务标记为「已确认」(acknowledged)。
|
|
29
|
+
* @param debtId - 债务条目 ID
|
|
30
|
+
*/
|
|
8
31
|
acknowledge(debtId: string): Promise<void>;
|
|
32
|
+
/** 将指定债务标记为「已解决」(resolved),同时记录解决时间。
|
|
33
|
+
* @param debtId - 债务条目 ID
|
|
34
|
+
*/
|
|
9
35
|
resolve(debtId: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* 按债务类别统计未解决的条目数量。
|
|
38
|
+
* @returns 以类别名为键、数量为值的统计对象
|
|
39
|
+
*/
|
|
10
40
|
getStats(): Promise<Record<string, number>>;
|
|
41
|
+
/**
|
|
42
|
+
* 计算指定天数内债务的增减趋势。
|
|
43
|
+
* @param sinceDays - 统计回溯天数
|
|
44
|
+
* @returns 包含新增数(created)、已解决数(resolved)和净增量(net)的趋势数据
|
|
45
|
+
*/
|
|
11
46
|
getTrend(sinceDays: number): Promise<{
|
|
12
47
|
created: number;
|
|
13
48
|
resolved: number;
|
|
14
49
|
net: number;
|
|
15
50
|
}>;
|
|
51
|
+
/**
|
|
52
|
+
* 按优先级对未解决债务排序。优先级 = 严重程度分 x 影响程度分。
|
|
53
|
+
* severity: critical=4, warning=3, info=1
|
|
54
|
+
* impact: high=3, medium=2, low=1
|
|
55
|
+
* @returns 按优先级降序排列的债务列表(最高优先在前)
|
|
56
|
+
*/
|
|
16
57
|
prioritize(): Promise<DebtItem[]>;
|
|
58
|
+
/**
|
|
59
|
+
* 清理已过期且已解决的债务条目。
|
|
60
|
+
* 超过 MAX_DEBT_AGE_DAYS(30 天)的已解决条目将被删除。
|
|
61
|
+
* @returns 本次清理删除的条目数量
|
|
62
|
+
*/
|
|
17
63
|
cleanup(): Promise<number>;
|
|
64
|
+
/**
|
|
65
|
+
* 更新指定债务条目的状态。使用原子写入保证数据一致性。
|
|
66
|
+
* @param debtId - 债务条目 ID
|
|
67
|
+
* @param status - 新状态(acknowledged 或 resolved)
|
|
68
|
+
* @param resolvedAt - 解决时间(仅当 status 为 resolved 时有效)
|
|
69
|
+
*/
|
|
18
70
|
private updateStatus;
|
|
19
71
|
}
|
|
20
72
|
//# sourceMappingURL=debt_tracker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debt_tracker.d.ts","sourceRoot":"","sources":["../../src/engine/debt_tracker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"debt_tracker.d.ts","sourceRoot":"","sources":["../../src/engine/debt_tracker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;AAW3E;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IAExB;;;OAGG;gBACS,WAAW,EAAE,MAAM;IAI/B,0BAA0B;IACpB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC;;;;;;OAMG;IACG,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiCzE;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkBrC;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAUjD;;;;OAIG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAyB9F;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAavC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IA4BhC;;;;;OAKG;YACW,YAAY;CAgB3B"}
|
|
@@ -2,19 +2,41 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import fss from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import crypto from "node:crypto";
|
|
5
|
+
/**
|
|
6
|
+
* 技术债务追踪模块 — 持久化存储、查询、统计和清理技术债务条目。
|
|
7
|
+
* 基于文件系统实现(JSON 单文件存储),零外部依赖。
|
|
8
|
+
* 每条债务对应一个 `.json` 文件,以 `debt-<short-uuid>.json` 命名。
|
|
9
|
+
*/
|
|
10
|
+
/** 已解决债务的默认保留天数,超过后将被 cleanup 自动清理 */
|
|
5
11
|
const MAX_DEBT_AGE_DAYS = 30;
|
|
12
|
+
/**
|
|
13
|
+
* 技术债务追踪器 — 负责债务的增删改查、统计聚合与过期清理。
|
|
14
|
+
* 债务数据存储在 `{projectPath}/.soloforge/state/debt/` 目录下。
|
|
15
|
+
*/
|
|
6
16
|
export class DebtTracker {
|
|
7
17
|
debtDir;
|
|
18
|
+
/**
|
|
19
|
+
* 初始化债务追踪器。
|
|
20
|
+
* @param projectPath - 项目根目录路径
|
|
21
|
+
*/
|
|
8
22
|
constructor(projectPath) {
|
|
9
23
|
this.debtDir = path.join(projectPath, ".soloforge", "state", "debt");
|
|
10
24
|
}
|
|
25
|
+
/** 确保债务存储目录存在,不存在则递归创建 */
|
|
11
26
|
async ensureDir() {
|
|
12
27
|
await fs.mkdir(this.debtDir, { recursive: true });
|
|
13
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* 将代码审查发现记录为一条新的技术债务。
|
|
31
|
+
* 使用原子写入(先写临时文件再 rename)保证数据一致性。
|
|
32
|
+
* @param finding - 代码审查发现结果
|
|
33
|
+
* @param taskId - 关联的任务 ID
|
|
34
|
+
* @returns 新创建的债务条目 ID
|
|
35
|
+
*/
|
|
14
36
|
async recordDebt(finding, taskId) {
|
|
15
37
|
await this.ensureDir();
|
|
16
38
|
const id = `debt-${crypto.randomUUID().slice(0, 8)}`;
|
|
17
|
-
//
|
|
39
|
+
// 审查维度到债务类别的映射表
|
|
18
40
|
const dimensionToCategory = {
|
|
19
41
|
quality: "other",
|
|
20
42
|
security: "security",
|
|
@@ -36,10 +58,15 @@ export class DebtTracker {
|
|
|
36
58
|
};
|
|
37
59
|
const filePath = path.join(this.debtDir, `${id}.json`);
|
|
38
60
|
const tmpPath = `${filePath}.tmp`;
|
|
61
|
+
// 原子写入:先写入临时文件,再重命名为目标文件,防止写入中断导致数据损坏
|
|
39
62
|
await fs.writeFile(tmpPath, JSON.stringify(item, null, 2));
|
|
40
63
|
await fs.rename(tmpPath, filePath);
|
|
41
64
|
return id;
|
|
42
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* 列出所有状态为 open 的债务条目,按发现时间升序排列。
|
|
68
|
+
* @returns 未解决的债务条目列表
|
|
69
|
+
*/
|
|
43
70
|
async listOpen() {
|
|
44
71
|
await this.ensureDir();
|
|
45
72
|
const files = await fs.readdir(this.debtDir);
|
|
@@ -57,14 +84,25 @@ export class DebtTracker {
|
|
|
57
84
|
console.debug("[soloforge]", e);
|
|
58
85
|
}
|
|
59
86
|
}
|
|
87
|
+
// 按发现时间升序排列,最早的债务排在前面
|
|
60
88
|
return items.sort((a, b) => a.discovered_at.localeCompare(b.discovered_at));
|
|
61
89
|
}
|
|
90
|
+
/** 将指定债务标记为「已确认」(acknowledged)。
|
|
91
|
+
* @param debtId - 债务条目 ID
|
|
92
|
+
*/
|
|
62
93
|
async acknowledge(debtId) {
|
|
63
94
|
await this.updateStatus(debtId, "acknowledged");
|
|
64
95
|
}
|
|
96
|
+
/** 将指定债务标记为「已解决」(resolved),同时记录解决时间。
|
|
97
|
+
* @param debtId - 债务条目 ID
|
|
98
|
+
*/
|
|
65
99
|
async resolve(debtId) {
|
|
66
100
|
await this.updateStatus(debtId, "resolved", new Date().toISOString());
|
|
67
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* 按债务类别统计未解决的条目数量。
|
|
104
|
+
* @returns 以类别名为键、数量为值的统计对象
|
|
105
|
+
*/
|
|
68
106
|
async getStats() {
|
|
69
107
|
const openItems = await this.listOpen();
|
|
70
108
|
const stats = {};
|
|
@@ -74,6 +112,11 @@ export class DebtTracker {
|
|
|
74
112
|
}
|
|
75
113
|
return stats;
|
|
76
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* 计算指定天数内债务的增减趋势。
|
|
117
|
+
* @param sinceDays - 统计回溯天数
|
|
118
|
+
* @returns 包含新增数(created)、已解决数(resolved)和净增量(net)的趋势数据
|
|
119
|
+
*/
|
|
77
120
|
async getTrend(sinceDays) {
|
|
78
121
|
await this.ensureDir();
|
|
79
122
|
const cutoff = new Date();
|
|
@@ -90,6 +133,7 @@ export class DebtTracker {
|
|
|
90
133
|
const item = JSON.parse(content);
|
|
91
134
|
if (item.discovered_at >= cutoffStr)
|
|
92
135
|
created++;
|
|
136
|
+
// 仅统计在时间窗口内解决的条目
|
|
93
137
|
if (item.status === "resolved" && item.resolved_at && item.resolved_at >= cutoffStr)
|
|
94
138
|
resolved++;
|
|
95
139
|
}
|
|
@@ -97,11 +141,20 @@ export class DebtTracker {
|
|
|
97
141
|
console.debug("[soloforge]", e);
|
|
98
142
|
}
|
|
99
143
|
}
|
|
144
|
+
// 净增量 = 新增 - 已解决;正值表示债务在增长
|
|
100
145
|
return { created, resolved, net: created - resolved };
|
|
101
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* 按优先级对未解决债务排序。优先级 = 严重程度分 x 影响程度分。
|
|
149
|
+
* severity: critical=4, warning=3, info=1
|
|
150
|
+
* impact: high=3, medium=2, low=1
|
|
151
|
+
* @returns 按优先级降序排列的债务列表(最高优先在前)
|
|
152
|
+
*/
|
|
102
153
|
async prioritize() {
|
|
103
154
|
const openItems = await this.listOpen();
|
|
155
|
+
// 严重程度权重:critical 最重,info 最轻
|
|
104
156
|
const sevScore = { critical: 4, warning: 3, info: 1 };
|
|
157
|
+
// 影响程度权重:high 最重,low 最轻
|
|
105
158
|
const impScore = { high: 3, medium: 2, low: 1 };
|
|
106
159
|
return [...openItems].sort((a, b) => {
|
|
107
160
|
const sa = (sevScore[a.severity] ?? 1) * (impScore[a.impact ?? "medium"] ?? 2);
|
|
@@ -109,6 +162,11 @@ export class DebtTracker {
|
|
|
109
162
|
return sb - sa;
|
|
110
163
|
});
|
|
111
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* 清理已过期且已解决的债务条目。
|
|
167
|
+
* 超过 MAX_DEBT_AGE_DAYS(30 天)的已解决条目将被删除。
|
|
168
|
+
* @returns 本次清理删除的条目数量
|
|
169
|
+
*/
|
|
112
170
|
async cleanup() {
|
|
113
171
|
await this.ensureDir();
|
|
114
172
|
const files = await fs.readdir(this.debtDir);
|
|
@@ -135,8 +193,15 @@ export class DebtTracker {
|
|
|
135
193
|
}
|
|
136
194
|
return removed;
|
|
137
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* 更新指定债务条目的状态。使用原子写入保证数据一致性。
|
|
198
|
+
* @param debtId - 债务条目 ID
|
|
199
|
+
* @param status - 新状态(acknowledged 或 resolved)
|
|
200
|
+
* @param resolvedAt - 解决时间(仅当 status 为 resolved 时有效)
|
|
201
|
+
*/
|
|
138
202
|
async updateStatus(debtId, status, resolvedAt) {
|
|
139
203
|
const filePath = path.join(this.debtDir, `${debtId}.json`);
|
|
204
|
+
// 债务文件不存在则静默返回,避免重复操作的报错
|
|
140
205
|
if (!fss.existsSync(filePath))
|
|
141
206
|
return;
|
|
142
207
|
const content = await fs.readFile(filePath, "utf-8");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debt_tracker.js","sourceRoot":"","sources":["../../src/engine/debt_tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,GAAG,MAAM,SAAS,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,OAAO,WAAW;IACd,OAAO,CAAS;IAExB,YAAY,WAAmB;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAsB,EAAE,MAAc;QACrD,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,QAAQ,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAErD,
|
|
1
|
+
{"version":3,"file":"debt_tracker.js","sourceRoot":"","sources":["../../src/engine/debt_tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
import type { DebugSession } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 执行完整的六步调试流水线。
|
|
4
|
+
* 依次执行错误解析、调用链提取、根因分析、修复建议和测试补充,
|
|
5
|
+
* 将结果组装为完整的调试会话对象。
|
|
6
|
+
* @param errorOutput - 原始错误输出文本
|
|
7
|
+
* @param taskId - 关联的任务 ID
|
|
8
|
+
* @param projectScope - 可选的项目路径范围(用于过滤调用链帧)
|
|
9
|
+
* @returns 完整的调试会话对象
|
|
10
|
+
*/
|
|
2
11
|
export declare function debugError(errorOutput: string, taskId: string, projectScope?: string[]): DebugSession;
|
|
3
12
|
//# sourceMappingURL=debugger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debugger.d.ts","sourceRoot":"","sources":["../../src/engine/debugger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAQV,YAAY,EACb,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"debugger.d.ts","sourceRoot":"","sources":["../../src/engine/debugger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAQV,YAAY,EACb,MAAM,aAAa,CAAC;AAmarB;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,YAAY,CAgBd"}
|