soloforge 1.0.0 → 1.1.0
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 +146 -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
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import type { ScopeCheckResult } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 检查文件路径是否在允许的范围内,并可选地扫描文件内容中的敏感信息。
|
|
4
|
+
*
|
|
5
|
+
* 检查流程:
|
|
6
|
+
* 1. 解析符号链接并规范化路径
|
|
7
|
+
* 2. 遍历允许路径列表,执行目录边界校验(防止路径穿越攻击)
|
|
8
|
+
* 3. 若提供了内容参数,对内容进行密钥/敏感信息检测
|
|
9
|
+
*
|
|
10
|
+
* @param filePath - 待检查的文件路径
|
|
11
|
+
* @param allowedPaths - 允许的路径列表
|
|
12
|
+
* @param content - 可选的文件内容,用于敏感信息检测
|
|
13
|
+
* @returns 作用域检查结果,包含是否允许、原因、严重等级和密钥详情
|
|
14
|
+
*/
|
|
2
15
|
export declare function checkScope(filePath: string, allowedPaths: string[], content?: string): ScopeCheckResult;
|
|
3
16
|
//# sourceMappingURL=scope_controller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope_controller.d.ts","sourceRoot":"","sources":["../../src/engine/scope_controller.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"scope_controller.d.ts","sourceRoot":"","sources":["../../src/engine/scope_controller.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA2EpD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,CAAC,EAAE,MAAM,GACf,gBAAgB,CA4ClB"}
|
|
@@ -1,38 +1,88 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { execFileSync } from "node:child_process";
|
|
4
|
+
/**
|
|
5
|
+
* 作用域控制器 — 检查文件路径是否在允许范围内,并检测敏感信息泄露。
|
|
6
|
+
*
|
|
7
|
+
* 核心功能:
|
|
8
|
+
* 1. 路径范围校验:解析符号链接后,判断文件是否在声明的允许路径内(防止路径穿越)
|
|
9
|
+
* 2. 敏感信息检测:优先使用 gitleaks 扫描密钥,回退到正则表达式匹配
|
|
10
|
+
* 3. 安全模式识别:跳过通过环境变量引用的配置行(如 process.env.X)
|
|
11
|
+
*/
|
|
12
|
+
/** gitleaks 可用性缓存,避免重复执行 which 检测 */
|
|
4
13
|
let gitleaksAvailable = null;
|
|
14
|
+
let gitleaksCheckedAt = 0;
|
|
15
|
+
const GITLEAKS_CACHE_TTL = 5 * 60 * 1000; // 5 分钟
|
|
16
|
+
/**
|
|
17
|
+
* 检测系统中是否安装了 gitleaks 密钥扫描工具。
|
|
18
|
+
* 结果会被缓存 5 分钟,超时后重新检测。
|
|
19
|
+
* @returns true 表示 gitleaks 可用
|
|
20
|
+
*/
|
|
5
21
|
function isGitleaksAvailable() {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
if (gitleaksAvailable !== null && now - gitleaksCheckedAt < GITLEAKS_CACHE_TTL) {
|
|
24
|
+
return gitleaksAvailable;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
execFileSync("which", ["gitleaks"], { stdio: "pipe" });
|
|
28
|
+
gitleaksAvailable = true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
gitleaksAvailable = false;
|
|
14
32
|
}
|
|
33
|
+
gitleaksCheckedAt = now;
|
|
15
34
|
return gitleaksAvailable;
|
|
16
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* 密钥/敏感信息正则匹配规则。
|
|
38
|
+
* 每条规则包含:匹配正则、类型标识、严重等级(blocked 表示禁止,warning 表示警告)。
|
|
39
|
+
*
|
|
40
|
+
* 覆盖的密钥类型:AWS 访问密钥、API 密钥、数据库密码、JWT 密钥等。
|
|
41
|
+
*/
|
|
17
42
|
const SECRET_PATTERNS = [
|
|
43
|
+
// AWS 访问密钥 ID:以 AKIA 开头的 20 位大写字母数字
|
|
18
44
|
{ pattern: /AKIA[0-9A-Z]{16}/, type: "aws_access_key", severity: "blocked" },
|
|
45
|
+
// AWS 密钥赋值语句
|
|
19
46
|
{ pattern: /aws_secret_access_key\s*=\s*['"][^'"]+['"]/, type: "aws_secret", severity: "blocked" },
|
|
47
|
+
// 通用 API 密钥(如 OpenAI sk- 前缀)
|
|
20
48
|
{ pattern: /sk-[a-zA-Z0-9]{32,}/, type: "api_key", severity: "blocked" },
|
|
49
|
+
// 32 位以上十六进制字符串(可能是令牌或哈希值)
|
|
21
50
|
{ pattern: /['"][a-f0-9]{32,}['"]/, type: "possible_token", severity: "warning" },
|
|
51
|
+
// 数据库密码赋值语句(8 位以上)
|
|
22
52
|
{ pattern: /password\s*=\s*['"][^'"]{8,}['"]/, type: "db_password", severity: "blocked" },
|
|
53
|
+
// JWT 签名密钥
|
|
23
54
|
{ pattern: /jwt_secret\s*=\s*['"][^'"]+['"]/, type: "jwt_secret", severity: "blocked" },
|
|
55
|
+
// 通用密钥赋值
|
|
24
56
|
{ pattern: /secret_key\s*=\s*['"][^'"]+['"]/, type: "secret_key", severity: "blocked" },
|
|
25
57
|
];
|
|
58
|
+
/**
|
|
59
|
+
* 安全模式正则列表 — 匹配到这些模式的行将被跳过,
|
|
60
|
+
* 因为它们通过环境变量引用敏感值,而非硬编码。
|
|
61
|
+
*/
|
|
26
62
|
const SAFE_PATTERNS = [
|
|
27
63
|
/process\.env\./,
|
|
28
64
|
/System\.getenv\(/,
|
|
29
65
|
/import\.meta\.env\./,
|
|
66
|
+
// 环境变量名本身不是敏感值
|
|
30
67
|
/NODE_ENV/,
|
|
31
68
|
];
|
|
69
|
+
/**
|
|
70
|
+
* 检查文件路径是否在允许的范围内,并可选地扫描文件内容中的敏感信息。
|
|
71
|
+
*
|
|
72
|
+
* 检查流程:
|
|
73
|
+
* 1. 解析符号链接并规范化路径
|
|
74
|
+
* 2. 遍历允许路径列表,执行目录边界校验(防止路径穿越攻击)
|
|
75
|
+
* 3. 若提供了内容参数,对内容进行密钥/敏感信息检测
|
|
76
|
+
*
|
|
77
|
+
* @param filePath - 待检查的文件路径
|
|
78
|
+
* @param allowedPaths - 允许的路径列表
|
|
79
|
+
* @param content - 可选的文件内容,用于敏感信息检测
|
|
80
|
+
* @returns 作用域检查结果,包含是否允许、原因、严重等级和密钥详情
|
|
81
|
+
*/
|
|
32
82
|
export function checkScope(filePath, allowedPaths, content) {
|
|
33
|
-
//
|
|
83
|
+
// 解析符号链接并规范化,防止通过符号链接绕过路径检查
|
|
34
84
|
const resolvedPath = realPath(filePath);
|
|
35
|
-
// 检查路径是否在允许的 scope
|
|
85
|
+
// 检查路径是否在允许的 scope 内(防止路径穿越攻击)
|
|
36
86
|
const inScope = allowedPaths.some((allowed) => {
|
|
37
87
|
const resolved = realPath(allowed);
|
|
38
88
|
if (!resolvedPath.startsWith(resolved))
|
|
@@ -72,10 +122,18 @@ export function checkScope(filePath, allowedPaths, content) {
|
|
|
72
122
|
}
|
|
73
123
|
return { allowed: true, has_secrets: false, severity: "ok" };
|
|
74
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* 检测文件内容中的密钥和敏感信息。
|
|
127
|
+
* 优先使用 gitleaks 进行专业扫描;不可用时回退到正则匹配。
|
|
128
|
+
* @param content - 文件文本内容
|
|
129
|
+
* @param filePath - 文件路径(用于 gitleaks 的 `-s` 参数)
|
|
130
|
+
* @returns 检测到的敏感信息列表(最多返回 10 条 gitleaks 结果)
|
|
131
|
+
*/
|
|
75
132
|
function detectSecrets(content, filePath) {
|
|
76
|
-
// 如果可用,优先使用 gitleaks
|
|
133
|
+
// 如果可用,优先使用 gitleaks 进行更全面的扫描
|
|
77
134
|
if (isGitleaksAvailable()) {
|
|
78
135
|
try {
|
|
136
|
+
// --no-git: 不依赖 git 仓库;-f json: JSON 格式输出;-s: 指定扫描目标文件
|
|
79
137
|
const result = execFileSync("gitleaks", ["detect", "--no-git", "-f", "json", "-s", filePath], { encoding: "utf-8", timeout: 5000 });
|
|
80
138
|
const findings = JSON.parse(result || "[]");
|
|
81
139
|
if (Array.isArray(findings) && findings.length > 0) {
|
|
@@ -99,7 +157,7 @@ function detectSecrets(content, filePath) {
|
|
|
99
157
|
// 跳过使用环境变量的行
|
|
100
158
|
if (SAFE_PATTERNS.some((p) => p.test(line)))
|
|
101
159
|
continue;
|
|
102
|
-
//
|
|
160
|
+
// 跳过注释行(// 单行注释、# shebang/注释、<!-- HTML注释、* 多行注释片段)
|
|
103
161
|
if (/^\s*(\/\/|#|<!--|\*)/.test(line))
|
|
104
162
|
continue;
|
|
105
163
|
for (const rule of SECRET_PATTERNS) {
|
|
@@ -110,6 +168,12 @@ function detectSecrets(content, filePath) {
|
|
|
110
168
|
}
|
|
111
169
|
return results;
|
|
112
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* 解析文件的真实路径(处理符号链接)。
|
|
173
|
+
* 若文件不存在或解析失败,回退到简单的路径规范化。
|
|
174
|
+
* @param p - 待解析的路径
|
|
175
|
+
* @returns 解析后的绝对路径
|
|
176
|
+
*/
|
|
113
177
|
function realPath(p) {
|
|
114
178
|
try {
|
|
115
179
|
return fs.realpathSync(path.resolve(p));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope_controller.js","sourceRoot":"","sources":["../../src/engine/scope_controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,IAAI,iBAAiB,GAAmB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"scope_controller.js","sourceRoot":"","sources":["../../src/engine/scope_controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +1,158 @@
|
|
|
1
1
|
import type { TaskContext, ClassifyResult, ExpandResult, VerifyResult, FailureRecord, PlanResult, CodeReviewResult, DeliveryResult } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 任务上下文管理器 — 负责任务状态的创建、持久化、查询和生命周期管理。
|
|
4
|
+
* 状态文件存储在 stateDir 目录下,每个任务一个 JSON 文件。
|
|
5
|
+
* 使用 "current-task.json" 指针文件标记当前活跃任务。
|
|
6
|
+
*/
|
|
2
7
|
export declare class TaskContextManager {
|
|
3
8
|
private stateDir;
|
|
4
9
|
constructor(stateDir: string);
|
|
10
|
+
/** 获取状态存储目录路径 */
|
|
5
11
|
getStateDir(): string;
|
|
12
|
+
/**
|
|
13
|
+
* 创建新任务上下文,生成唯一 ID 并持久化到磁盘。
|
|
14
|
+
* @param intent - 用户意图文本
|
|
15
|
+
* @param productProfile - 产品类型标识
|
|
16
|
+
* @returns 新创建的任务上下文
|
|
17
|
+
*/
|
|
6
18
|
create(intent: string, productProfile: string): Promise<TaskContext>;
|
|
19
|
+
/**
|
|
20
|
+
* 从磁盘加载任务上下文。
|
|
21
|
+
* @param taskId - 任务 ID
|
|
22
|
+
* @returns 任务上下文对象,不存在或解析失败时返回 null
|
|
23
|
+
*/
|
|
7
24
|
load(taskId: string): Promise<TaskContext | null>;
|
|
25
|
+
/**
|
|
26
|
+
* 持久化任务上下文到磁盘(先写临时文件再 rename,保证原子性)。
|
|
27
|
+
* @param ctx - 任务上下文对象
|
|
28
|
+
*/
|
|
8
29
|
save(ctx: TaskContext): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* 更新任务状态,严格校验状态转换合法性。
|
|
32
|
+
* @param taskId - 任务 ID
|
|
33
|
+
* @param status - 目标状态
|
|
34
|
+
* @returns 更新后的任务上下文,任务不存在时返回 null
|
|
35
|
+
* @throws 非法状态转换时抛出 Error
|
|
36
|
+
*/
|
|
9
37
|
updateStatus(taskId: string, status: TaskContext["status"]): Promise<TaskContext | null>;
|
|
38
|
+
/**
|
|
39
|
+
* 设置任务的分类结果。
|
|
40
|
+
* @param taskId - 任务 ID
|
|
41
|
+
* @param result - 分类结果
|
|
42
|
+
* @returns 更新后的任务上下文,任务不存在时返回 null
|
|
43
|
+
*/
|
|
10
44
|
setClassification(taskId: string, result: ClassifyResult): Promise<TaskContext | null>;
|
|
45
|
+
/**
|
|
46
|
+
* 设置任务的意图膨胀结果。
|
|
47
|
+
* @param taskId - 任务 ID
|
|
48
|
+
* @param result - 膨胀结果
|
|
49
|
+
* @returns 更新后的任务上下文,任务不存在时返回 null
|
|
50
|
+
*/
|
|
11
51
|
setExpansion(taskId: string, result: ExpandResult): Promise<TaskContext | null>;
|
|
52
|
+
/**
|
|
53
|
+
* 记录执行结果: 变更文件列表和可选的失败记录。
|
|
54
|
+
* 变更文件自动去重合并,失败记录追加到历史。
|
|
55
|
+
* @param taskId - 任务 ID
|
|
56
|
+
* @param changedFiles - 变更文件路径列表
|
|
57
|
+
* @param failure - 可选的失败记录
|
|
58
|
+
* @returns 更新后的任务上下文,任务不存在时返回 null
|
|
59
|
+
*/
|
|
12
60
|
setExecution(taskId: string, changedFiles: string[], failure?: FailureRecord): Promise<TaskContext | null>;
|
|
61
|
+
/**
|
|
62
|
+
* 设置任务的验证结果。
|
|
63
|
+
* @param taskId - 任务 ID
|
|
64
|
+
* @param result - 验证结果
|
|
65
|
+
* @returns 更新后的任务上下文,任务不存在时返回 null
|
|
66
|
+
*/
|
|
13
67
|
setVerification(taskId: string, result: VerifyResult): Promise<TaskContext | null>;
|
|
68
|
+
/**
|
|
69
|
+
* 获取当前活跃任务(通过 current-task.json 指针定位)。
|
|
70
|
+
* @returns 当前任务上下文,无活跃任务或读取失败时返回 null
|
|
71
|
+
*/
|
|
14
72
|
getCurrentTask(): Promise<TaskContext | null>;
|
|
73
|
+
/**
|
|
74
|
+
* 取消未完成的任务,将状态设为 failed。
|
|
75
|
+
* @param taskId - 任务 ID
|
|
76
|
+
* @returns 是否取消成功(已完成的任务无法取消)
|
|
77
|
+
*/
|
|
15
78
|
cancel(taskId: string): Promise<boolean>;
|
|
79
|
+
/**
|
|
80
|
+
* 判断任务是否可恢复(非 done / failed / classifying 状态均可恢复)。
|
|
81
|
+
* @param ctx - 任务上下文
|
|
82
|
+
* @returns 是否可恢复
|
|
83
|
+
*/
|
|
16
84
|
isResumable(ctx: TaskContext): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* 根据当前状态生成恢复提示信息。
|
|
87
|
+
* @param ctx - 任务上下文
|
|
88
|
+
* @returns 恢复提示文本
|
|
89
|
+
*/
|
|
17
90
|
getResumeHint(ctx: TaskContext): string;
|
|
91
|
+
/**
|
|
92
|
+
* 列出最近的任务(按创建时间降序排列)。
|
|
93
|
+
* @param limit - 返回数量上限,默认 10
|
|
94
|
+
* @returns 任务摘要列表
|
|
95
|
+
*/
|
|
18
96
|
listRecent(limit?: number): Promise<Array<{
|
|
19
97
|
task_id: string;
|
|
20
98
|
intent: string;
|
|
21
99
|
status: string;
|
|
22
100
|
created_at: string;
|
|
23
101
|
}>>;
|
|
102
|
+
/**
|
|
103
|
+
* 清理过期和超量任务: 删除超过 30 天的任务,超过 100 个时淘汰最旧的已完成/已失败任务。
|
|
104
|
+
* @returns 删除的任务数量
|
|
105
|
+
*/
|
|
24
106
|
cleanup(): Promise<number>;
|
|
107
|
+
/**
|
|
108
|
+
* 设置任务计划结果。
|
|
109
|
+
* @param taskId - 任务 ID
|
|
110
|
+
* @param result - 计划结果
|
|
111
|
+
* @returns 更新后的任务上下文,任务不存在时返回 null
|
|
112
|
+
*/
|
|
25
113
|
setPlanning(taskId: string, result: PlanResult): Promise<TaskContext | null>;
|
|
114
|
+
/**
|
|
115
|
+
* 设置代码审查结果,并基于审查发现计算阶段指令(能力 6)。
|
|
116
|
+
* @param taskId - 任务 ID
|
|
117
|
+
* @param result - 代码审查结果
|
|
118
|
+
* @returns 更新后的任务上下文,任务不存在时返回 null
|
|
119
|
+
*/
|
|
26
120
|
setCodeReview(taskId: string, result: CodeReviewResult): Promise<TaskContext | null>;
|
|
121
|
+
/**
|
|
122
|
+
* 设置交付结果。
|
|
123
|
+
* @param taskId - 任务 ID
|
|
124
|
+
* @param result - 交付结果
|
|
125
|
+
* @returns 更新后的任务上下文,任务不存在时返回 null
|
|
126
|
+
*/
|
|
27
127
|
setDelivery(taskId: string, result: DeliveryResult): Promise<TaskContext | null>;
|
|
128
|
+
/**
|
|
129
|
+
* 更新修复循环状态(能力 3): 递增尝试次数,记录失败阶段和自动修复能力。
|
|
130
|
+
* 同时统计同一阶段的复发次数。
|
|
131
|
+
* @param taskId - 任务 ID
|
|
132
|
+
* @param failurePhase - 发生失败的阶段名称
|
|
133
|
+
* @param autoRepairable - 是否可自动修复
|
|
134
|
+
* @param escalationReason - 可选的升级原因
|
|
135
|
+
* @returns 更新后的任务上下文,任务不存在或无执行记录时返回 null
|
|
136
|
+
*/
|
|
28
137
|
updateRepairLoop(taskId: string, failurePhase: string, autoRepairable: boolean, escalationReason?: string): Promise<TaskContext | null>;
|
|
138
|
+
/**
|
|
139
|
+
* 记录返工事件(能力 6): 追踪从哪个阶段回退到哪个阶段及原因。
|
|
140
|
+
* 超过 MAX_REWORK 阈值时自动设置阶段指令为 stop_escalate。
|
|
141
|
+
* @param taskId - 任务 ID
|
|
142
|
+
* @param fromPhase - 源阶段
|
|
143
|
+
* @param toPhase - 目标阶段
|
|
144
|
+
* @param reason - 返工原因
|
|
145
|
+
* @returns 更新后的任务上下文,任务不存在时返回 null
|
|
146
|
+
*/
|
|
29
147
|
recordRework(taskId: string, fromPhase: string, toPhase: string, reason: string): Promise<TaskContext | null>;
|
|
148
|
+
/** 生成任务状态文件的完整路径 */
|
|
30
149
|
private taskFilePath;
|
|
150
|
+
/** 当前任务指针文件路径 */
|
|
31
151
|
private get pointerPath();
|
|
152
|
+
/**
|
|
153
|
+
* 写入当前任务指针文件。
|
|
154
|
+
* @param taskId - 任务 ID
|
|
155
|
+
*/
|
|
32
156
|
private writeCurrentPointer;
|
|
33
157
|
}
|
|
34
158
|
//# sourceMappingURL=task_context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task_context.d.ts","sourceRoot":"","sources":["../../src/engine/task_context.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAkD,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"task_context.d.ts","sourceRoot":"","sources":["../../src/engine/task_context.ts"],"names":[],"mappings":"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"}
|