soloforge 1.1.45 → 1.1.46
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 +3 -3
- package/dist/context/contracts/lifecycle_knowledge_contract.d.ts.map +1 -1
- package/dist/context/contracts/lifecycle_knowledge_contract.js +2 -2
- package/dist/context/contracts/lifecycle_knowledge_contract.js.map +1 -1
- package/dist/core/task_context/manager.d.ts +0 -8
- package/dist/core/task_context/manager.d.ts.map +1 -1
- package/dist/core/task_context/manager.js +1 -19
- package/dist/core/task_context/manager.js.map +1 -1
- package/dist/core/task_context/state_fact_classifier.d.ts +0 -8
- package/dist/core/task_context/state_fact_classifier.d.ts.map +1 -1
- package/dist/core/task_context/state_fact_classifier.js +0 -36
- package/dist/core/task_context/state_fact_classifier.js.map +1 -1
- package/dist/domain/contracts/design_artifact_pack.d.ts +0 -1
- package/dist/domain/contracts/design_artifact_pack.d.ts.map +1 -1
- package/dist/domain/contracts/design_artifact_pack.js +1 -4
- package/dist/domain/contracts/design_artifact_pack.js.map +1 -1
- package/dist/domain/index.d.ts +1 -1
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/registry.d.ts +2 -2
- package/dist/domain/registry.d.ts.map +1 -1
- package/dist/domain/types.d.ts +1 -12
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/domain/types.js +3 -0
- package/dist/domain/types.js.map +1 -1
- package/dist/gate/contracts/capability_registry.d.ts.map +1 -1
- package/dist/gate/contracts/capability_registry.js +0 -26
- package/dist/gate/contracts/capability_registry.js.map +1 -1
- package/dist/gate/contracts/control_plane_contract.d.ts +1 -1
- package/dist/gate/contracts/control_plane_contract.d.ts.map +1 -1
- package/dist/gate/contracts/control_plane_contract.js +1 -10
- package/dist/gate/contracts/control_plane_contract.js.map +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.d.ts +1 -0
- package/dist/gate/contracts/tool_invocation_contract_registry.d.ts.map +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.js +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.js.map +1 -1
- package/dist/gate/index.d.ts +0 -2
- package/dist/gate/index.d.ts.map +1 -1
- package/dist/gate/index.js +0 -1
- package/dist/gate/index.js.map +1 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +1 -3
- package/dist/server/tools/index.js.map +1 -1
- package/dist/server/tools/lazy_loaders.d.ts +0 -23
- package/dist/server/tools/lazy_loaders.d.ts.map +1 -1
- package/dist/server/tools/lazy_loaders.js +2 -33
- package/dist/server/tools/lazy_loaders.js.map +1 -1
- package/dist/server/tools/middleware.d.ts +2 -5
- package/dist/server/tools/middleware.d.ts.map +1 -1
- package/dist/server/tools/middleware.js +3 -33
- package/dist/server/tools/middleware.js.map +1 -1
- package/dist/server/tools/sf_task.js +2 -7
- package/dist/server/tools/sf_task.js.map +1 -1
- package/dist/server/tools/types.d.ts +0 -2
- package/dist/server/tools/types.d.ts.map +1 -1
- package/dist/types/pipeline_types.d.ts +1 -9
- package/dist/types/pipeline_types.d.ts.map +1 -1
- package/dist/verify/audit/verifier.d.ts.map +1 -1
- package/dist/verify/audit/verifier.js +0 -33
- package/dist/verify/audit/verifier.js.map +1 -1
- package/dist/verify/index.d.ts +1 -4
- package/dist/verify/index.d.ts.map +1 -1
- package/dist/verify/index.js +0 -3
- package/dist/verify/index.js.map +1 -1
- package/dist/verify/types.d.ts +0 -21
- package/dist/verify/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/shared//345/206/263/347/255/226/347/275/221/345/205/263.md +7 -21
- package/dist/context/engine/dependency_scanner.d.ts +0 -23
- package/dist/context/engine/dependency_scanner.d.ts.map +0 -1
- package/dist/context/engine/dependency_scanner.js +0 -309
- package/dist/context/engine/dependency_scanner.js.map +0 -1
- package/dist/context/engine/exploration.d.ts +0 -194
- package/dist/context/engine/exploration.d.ts.map +0 -1
- package/dist/context/engine/exploration.js +0 -712
- package/dist/context/engine/exploration.js.map +0 -1
- package/dist/context/knowledge/knowledge_acceptance_registry.d.ts +0 -42
- package/dist/context/knowledge/knowledge_acceptance_registry.d.ts.map +0 -1
- package/dist/context/knowledge/knowledge_acceptance_registry.js +0 -249
- package/dist/context/knowledge/knowledge_acceptance_registry.js.map +0 -1
- package/dist/context/knowledge/knowledge_scenario_registry.d.ts +0 -26
- package/dist/context/knowledge/knowledge_scenario_registry.d.ts.map +0 -1
- package/dist/context/knowledge/knowledge_scenario_registry.js +0 -267
- package/dist/context/knowledge/knowledge_scenario_registry.js.map +0 -1
- package/dist/context/knowledge/knowledge_sovereignty.d.ts +0 -65
- package/dist/context/knowledge/knowledge_sovereignty.d.ts.map +0 -1
- package/dist/context/knowledge/knowledge_sovereignty.js +0 -199
- package/dist/context/knowledge/knowledge_sovereignty.js.map +0 -1
- package/dist/context/team_awareness.d.ts +0 -42
- package/dist/context/team_awareness.d.ts.map +0 -1
- package/dist/context/team_awareness.js +0 -154
- package/dist/context/team_awareness.js.map +0 -1
- package/dist/context/templates/template_asset_visibility.d.ts +0 -116
- package/dist/context/templates/template_asset_visibility.d.ts.map +0 -1
- package/dist/context/templates/template_asset_visibility.js +0 -310
- package/dist/context/templates/template_asset_visibility.js.map +0 -1
- package/dist/gate/conflict_gate.d.ts +0 -53
- package/dist/gate/conflict_gate.d.ts.map +0 -1
- package/dist/gate/conflict_gate.js +0 -96
- package/dist/gate/conflict_gate.js.map +0 -1
- package/dist/gate/contracts/capability_action_advisor.d.ts +0 -34
- package/dist/gate/contracts/capability_action_advisor.d.ts.map +0 -1
- package/dist/gate/contracts/capability_action_advisor.js +0 -165
- package/dist/gate/contracts/capability_action_advisor.js.map +0 -1
- package/dist/gate/contracts/capability_state_store.d.ts +0 -121
- package/dist/gate/contracts/capability_state_store.d.ts.map +0 -1
- package/dist/gate/contracts/capability_state_store.js +0 -188
- package/dist/gate/contracts/capability_state_store.js.map +0 -1
- package/dist/gate/contracts/contract_guard.d.ts +0 -50
- package/dist/gate/contracts/contract_guard.d.ts.map +0 -1
- package/dist/gate/contracts/contract_guard.js +0 -611
- package/dist/gate/contracts/contract_guard.js.map +0 -1
- package/dist/gate/contracts/escape_report.d.ts +0 -103
- package/dist/gate/contracts/escape_report.d.ts.map +0 -1
- package/dist/gate/contracts/escape_report.js +0 -145
- package/dist/gate/contracts/escape_report.js.map +0 -1
- package/dist/gate/feasibility_checker.d.ts +0 -27
- package/dist/gate/feasibility_checker.d.ts.map +0 -1
- package/dist/gate/feasibility_checker.js +0 -114
- package/dist/gate/feasibility_checker.js.map +0 -1
- package/dist/gate/migration_guard.d.ts +0 -22
- package/dist/gate/migration_guard.d.ts.map +0 -1
- package/dist/gate/migration_guard.js +0 -277
- package/dist/gate/migration_guard.js.map +0 -1
- package/dist/gate/scope_lease.d.ts +0 -94
- package/dist/gate/scope_lease.d.ts.map +0 -1
- package/dist/gate/scope_lease.js +0 -180
- package/dist/gate/scope_lease.js.map +0 -1
- package/dist/git/git_deps.d.ts +0 -85
- package/dist/git/git_deps.d.ts.map +0 -1
- package/dist/git/git_deps.js +0 -22
- package/dist/git/git_deps.js.map +0 -1
- package/dist/git/operations.d.ts +0 -173
- package/dist/git/operations.d.ts.map +0 -1
- package/dist/git/operations.js +0 -350
- package/dist/git/operations.js.map +0 -1
- package/dist/server/tools/gate_engine.d.ts +0 -17
- package/dist/server/tools/gate_engine.d.ts.map +0 -1
- package/dist/server/tools/gate_engine.js +0 -17
- package/dist/server/tools/gate_engine.js.map +0 -1
- package/dist/server/tools/middleware/budget_check.d.ts +0 -35
- package/dist/server/tools/middleware/budget_check.d.ts.map +0 -1
- package/dist/server/tools/middleware/budget_check.js +0 -69
- package/dist/server/tools/middleware/budget_check.js.map +0 -1
- package/dist/shared/contracts/contract_registry/builtin_contracts_core.d.ts +0 -16
- package/dist/shared/contracts/contract_registry/builtin_contracts_core.d.ts.map +0 -1
- package/dist/shared/contracts/contract_registry/builtin_contracts_core.js +0 -306
- package/dist/shared/contracts/contract_registry/builtin_contracts_core.js.map +0 -1
- package/dist/shared/contracts/contract_registry/builtin_contracts_core_2.d.ts +0 -16
- package/dist/shared/contracts/contract_registry/builtin_contracts_core_2.d.ts.map +0 -1
- package/dist/shared/contracts/contract_registry/builtin_contracts_core_2.js +0 -304
- package/dist/shared/contracts/contract_registry/builtin_contracts_core_2.js.map +0 -1
- package/dist/shared/contracts/contract_registry/builtin_contracts_extended.d.ts +0 -16
- package/dist/shared/contracts/contract_registry/builtin_contracts_extended.d.ts.map +0 -1
- package/dist/shared/contracts/contract_registry/builtin_contracts_extended.js +0 -434
- package/dist/shared/contracts/contract_registry/builtin_contracts_extended.js.map +0 -1
- package/dist/shared/contracts/contract_registry/index.d.ts +0 -8
- package/dist/shared/contracts/contract_registry/index.d.ts.map +0 -1
- package/dist/shared/contracts/contract_registry/index.js +0 -7
- package/dist/shared/contracts/contract_registry/index.js.map +0 -1
- package/dist/shared/contracts/contract_registry/registry.d.ts +0 -62
- package/dist/shared/contracts/contract_registry/registry.d.ts.map +0 -1
- package/dist/shared/contracts/contract_registry/registry.js +0 -191
- package/dist/shared/contracts/contract_registry/registry.js.map +0 -1
- package/dist/shared/contracts/contract_registry/registry_internal.d.ts +0 -19
- package/dist/shared/contracts/contract_registry/registry_internal.d.ts.map +0 -1
- package/dist/shared/contracts/contract_registry/registry_internal.js +0 -54
- package/dist/shared/contracts/contract_registry/registry_internal.js.map +0 -1
- package/dist/shared/contracts/contract_registry/types.d.ts +0 -47
- package/dist/shared/contracts/contract_registry/types.d.ts.map +0 -1
- package/dist/shared/contracts/contract_registry/types.js +0 -5
- package/dist/shared/contracts/contract_registry/types.js.map +0 -1
- package/dist/shared/contracts/contract_registry/validation.d.ts +0 -25
- package/dist/shared/contracts/contract_registry/validation.d.ts.map +0 -1
- package/dist/shared/contracts/contract_registry/validation.js +0 -363
- package/dist/shared/contracts/contract_registry/validation.js.map +0 -1
- package/dist/shared/llm_gateway.d.ts +0 -186
- package/dist/shared/llm_gateway.d.ts.map +0 -1
- package/dist/shared/llm_gateway.js +0 -393
- package/dist/shared/llm_gateway.js.map +0 -1
- package/dist/verify/audit/audit_sampler.d.ts +0 -29
- package/dist/verify/audit/audit_sampler.d.ts.map +0 -1
- package/dist/verify/audit/audit_sampler.js +0 -42
- package/dist/verify/audit/audit_sampler.js.map +0 -1
- package/dist/verify/audit/debt_reporter.d.ts +0 -22
- package/dist/verify/audit/debt_reporter.d.ts.map +0 -1
- package/dist/verify/audit/debt_reporter.js +0 -107
- package/dist/verify/audit/debt_reporter.js.map +0 -1
- package/dist/verify/audit/debugger.d.ts +0 -25
- package/dist/verify/audit/debugger.d.ts.map +0 -1
- package/dist/verify/audit/debugger.js +0 -429
- package/dist/verify/audit/debugger.js.map +0 -1
- package/dist/verify/audit/degradation.d.ts +0 -62
- package/dist/verify/audit/degradation.d.ts.map +0 -1
- package/dist/verify/audit/degradation.js +0 -78
- package/dist/verify/audit/degradation.js.map +0 -1
- package/dist/verify/audit/developer_sovereignty.d.ts +0 -29
- package/dist/verify/audit/developer_sovereignty.d.ts.map +0 -1
- package/dist/verify/audit/developer_sovereignty.js +0 -137
- package/dist/verify/audit/developer_sovereignty.js.map +0 -1
- package/dist/verify/audit/failure_report.d.ts +0 -76
- package/dist/verify/audit/failure_report.d.ts.map +0 -1
- package/dist/verify/audit/failure_report.js +0 -145
- package/dist/verify/audit/failure_report.js.map +0 -1
- package/dist/verify/audit/governance_report.d.ts +0 -110
- package/dist/verify/audit/governance_report.d.ts.map +0 -1
- package/dist/verify/audit/governance_report.js +0 -194
- package/dist/verify/audit/governance_report.js.map +0 -1
- package/dist/verify/audit/mutation_audit.d.ts +0 -40
- package/dist/verify/audit/mutation_audit.d.ts.map +0 -1
- package/dist/verify/audit/mutation_audit.js +0 -154
- package/dist/verify/audit/mutation_audit.js.map +0 -1
- package/dist/verify/audit/risk_sampler.d.ts +0 -44
- package/dist/verify/audit/risk_sampler.d.ts.map +0 -1
- package/dist/verify/audit/risk_sampler.js +0 -80
- package/dist/verify/audit/risk_sampler.js.map +0 -1
- package/dist/verify/audit/runtime_safety.d.ts +0 -89
- package/dist/verify/audit/runtime_safety.d.ts.map +0 -1
- package/dist/verify/audit/runtime_safety.js +0 -209
- package/dist/verify/audit/runtime_safety.js.map +0 -1
- package/dist/verify/audit/semantic_evidence.d.ts +0 -36
- package/dist/verify/audit/semantic_evidence.d.ts.map +0 -1
- package/dist/verify/audit/semantic_evidence.js +0 -90
- package/dist/verify/audit/semantic_evidence.js.map +0 -1
- package/dist/verify/audit/test_generator.d.ts +0 -23
- package/dist/verify/audit/test_generator.d.ts.map +0 -1
- package/dist/verify/audit/test_generator.js +0 -278
- package/dist/verify/audit/test_generator.js.map +0 -1
- package/dist/verify/audit/test_quality.d.ts +0 -49
- package/dist/verify/audit/test_quality.d.ts.map +0 -1
- package/dist/verify/audit/test_quality.js +0 -684
- package/dist/verify/audit/test_quality.js.map +0 -1
- package/dist/verify/change_coordinator.d.ts +0 -45
- package/dist/verify/change_coordinator.d.ts.map +0 -1
- package/dist/verify/change_coordinator.js +0 -168
- package/dist/verify/change_coordinator.js.map +0 -1
- package/dist/verify/contracts/decision_contract.d.ts +0 -51
- package/dist/verify/contracts/decision_contract.d.ts.map +0 -1
- package/dist/verify/contracts/decision_contract.js +0 -70
- package/dist/verify/contracts/decision_contract.js.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/contracts-audit.d.ts +0 -17
- package/dist/verify/contracts/mechanism_contract_registry/contracts-audit.d.ts.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/contracts-audit.js +0 -428
- package/dist/verify/contracts/mechanism_contract_registry/contracts-audit.js.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/contracts-governance.d.ts +0 -17
- package/dist/verify/contracts/mechanism_contract_registry/contracts-governance.d.ts.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/contracts-governance.js +0 -429
- package/dist/verify/contracts/mechanism_contract_registry/contracts-governance.js.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/contracts-pipeline.d.ts +0 -17
- package/dist/verify/contracts/mechanism_contract_registry/contracts-pipeline.d.ts.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/contracts-pipeline.js +0 -194
- package/dist/verify/contracts/mechanism_contract_registry/contracts-pipeline.js.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/contracts-platform.d.ts +0 -17
- package/dist/verify/contracts/mechanism_contract_registry/contracts-platform.d.ts.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/contracts-platform.js +0 -365
- package/dist/verify/contracts/mechanism_contract_registry/contracts-platform.js.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/index.d.ts +0 -19
- package/dist/verify/contracts/mechanism_contract_registry/index.d.ts.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/index.js +0 -21
- package/dist/verify/contracts/mechanism_contract_registry/index.js.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/types.d.ts +0 -33
- package/dist/verify/contracts/mechanism_contract_registry/types.d.ts.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/types.js +0 -5
- package/dist/verify/contracts/mechanism_contract_registry/types.js.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/validation.d.ts +0 -38
- package/dist/verify/contracts/mechanism_contract_registry/validation.d.ts.map +0 -1
- package/dist/verify/contracts/mechanism_contract_registry/validation.js +0 -136
- package/dist/verify/contracts/mechanism_contract_registry/validation.js.map +0 -1
- package/templates/shared/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md +0 -54
- package/templates/shared//346/265/201/345/274/217/345/277/203/350/267/263.md +0 -64
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Runtime Safety — 审计层模块。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:EvidenceBlock 等 审计层职责
|
|
6
|
-
* - 不负责:不属于本模块的职责由对应模块承担
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:发布门禁、质量检查
|
|
9
|
-
* 调用谁:node:crypto、logger
|
|
10
|
-
*
|
|
11
|
-
* 数据流:审计输入(代码/配置) → 检查 → 评分/报告
|
|
12
|
-
* 持久化:无持久化(纯计算/内存态)
|
|
13
|
-
*/
|
|
14
|
-
import crypto from "node:crypto";
|
|
15
|
-
import { debug } from "../../shared/logger.js";
|
|
16
|
-
/**
|
|
17
|
-
* 构建证据链 — 每个步骤产出带 hash 的证据块,与前一个块链式连接。
|
|
18
|
-
*/
|
|
19
|
-
export function buildEvidenceChain(steps) {
|
|
20
|
-
const chain = [];
|
|
21
|
-
let prevHash = null;
|
|
22
|
-
for (const s of steps) {
|
|
23
|
-
const timestamp = s.timestamp ?? new Date().toISOString();
|
|
24
|
-
const dataHash = crypto
|
|
25
|
-
.createHash("sha256")
|
|
26
|
-
.update(s.payload)
|
|
27
|
-
.digest("hex")
|
|
28
|
-
.slice(0, 16);
|
|
29
|
-
const chainInput = `${s.step}:${timestamp}:${dataHash}:${prevHash ?? "genesis"}`;
|
|
30
|
-
const chainHash = crypto
|
|
31
|
-
.createHash("sha256")
|
|
32
|
-
.update(chainInput)
|
|
33
|
-
.digest("hex")
|
|
34
|
-
.slice(0, 16);
|
|
35
|
-
const block = {
|
|
36
|
-
step: s.step,
|
|
37
|
-
timestamp,
|
|
38
|
-
data_hash: dataHash,
|
|
39
|
-
prev_hash: prevHash,
|
|
40
|
-
chain_hash: chainHash,
|
|
41
|
-
payload: s.payload,
|
|
42
|
-
};
|
|
43
|
-
chain.push(block);
|
|
44
|
-
prevHash = chainHash;
|
|
45
|
-
}
|
|
46
|
-
return chain;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* 验证证据链完整性 — 检查每个块的 chain_hash 是否与重算结果一致。
|
|
50
|
-
*/
|
|
51
|
-
export function verifyEvidenceChain(chain) {
|
|
52
|
-
if (chain.length > 0)
|
|
53
|
-
debug("运行安全", "验证证据链,块数:", chain.length);
|
|
54
|
-
if (chain.length === 0) {
|
|
55
|
-
return { valid: true, broken_at: null, advisory: "证据链为空,无需校验" };
|
|
56
|
-
}
|
|
57
|
-
for (let i = 0; i < chain.length; i++) {
|
|
58
|
-
const block = chain[i];
|
|
59
|
-
const expectedPrev = i === 0 ? null : chain[i - 1].chain_hash;
|
|
60
|
-
if (block.prev_hash !== expectedPrev) {
|
|
61
|
-
return {
|
|
62
|
-
valid: false,
|
|
63
|
-
broken_at: i,
|
|
64
|
-
advisory: `证据链在第 ${i} 步断裂: prev_hash 不匹配,请检查步骤顺序是否被篡改`,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
// 从 payload 重算 data_hash 以检测篡改
|
|
68
|
-
const expectedDataHash = crypto
|
|
69
|
-
.createHash("sha256")
|
|
70
|
-
.update(block.payload)
|
|
71
|
-
.digest("hex")
|
|
72
|
-
.slice(0, 16);
|
|
73
|
-
if (block.data_hash !== expectedDataHash) {
|
|
74
|
-
return {
|
|
75
|
-
valid: false,
|
|
76
|
-
broken_at: i,
|
|
77
|
-
advisory: `证据链在第 ${i} 步断裂: data_hash 不匹配(payload 被篡改),请恢复原始执行记录`,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
const chainInput = `${block.step}:${block.timestamp}:${block.data_hash}:${block.prev_hash ?? "genesis"}`;
|
|
81
|
-
const expectedHash = crypto
|
|
82
|
-
.createHash("sha256")
|
|
83
|
-
.update(chainInput)
|
|
84
|
-
.digest("hex")
|
|
85
|
-
.slice(0, 16);
|
|
86
|
-
if (block.chain_hash !== expectedHash) {
|
|
87
|
-
return {
|
|
88
|
-
valid: false,
|
|
89
|
-
broken_at: i,
|
|
90
|
-
advisory: `证据链在第 ${i} 步断裂: chain_hash 不匹配,请重新执行并生成完整证据链`,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return {
|
|
95
|
-
valid: true,
|
|
96
|
-
broken_at: null,
|
|
97
|
-
advisory: `证据链完整: ${chain.length} 个步骤已验证通过`,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
const DESTRUCTIVE_PATTERNS = [
|
|
101
|
-
{ pattern: /\brm\s+(-[rf]+\s+|--no-preserve-root)/, example: "rm -rf" },
|
|
102
|
-
{ pattern: /\bgit\s+(push\s+--force|reset\s+--hard|clean\s+-fd)/, example: "git push --force" },
|
|
103
|
-
{ pattern: /\bdd\s+if=/, example: "dd" },
|
|
104
|
-
{ pattern: /\b(format|mkfs)\b/, example: "format" },
|
|
105
|
-
{ pattern: /\bdrop\s+(table|database|schema)\b/i, example: "DROP TABLE" },
|
|
106
|
-
{ pattern: /\bTRUNCATE\b/i, example: "TRUNCATE" },
|
|
107
|
-
{ pattern: /\bDELETE\s+FROM\b/i, example: "DELETE FROM" },
|
|
108
|
-
{ pattern: /\b(npm\s+publish|yarn\s+publish|pnpm\s+publish)\b/, example: "npm publish" },
|
|
109
|
-
];
|
|
110
|
-
const MUTATING_PATTERNS = [
|
|
111
|
-
{ pattern: /\bgit\s+(add|commit|push|merge|rebase|checkout)\b/, example: "git commit" },
|
|
112
|
-
{ pattern: /\b(npm\s+install|yarn\s+add|pnpm\s+add)\b/, example: "npm install" },
|
|
113
|
-
{ pattern: /\bmv\s+/, example: "mv" },
|
|
114
|
-
{ pattern: /\bcp\s+/, example: "cp" },
|
|
115
|
-
{ pattern: /\bmkdir\s+/, example: "mkdir" },
|
|
116
|
-
{ pattern: /\bdocker\s+(run|build|push|rmi|rm)\b/, example: "docker run" },
|
|
117
|
-
{ pattern: /\b(INSERT|UPDATE|ALTER|CREATE)\b/i, example: "INSERT" },
|
|
118
|
-
];
|
|
119
|
-
/**
|
|
120
|
-
* 分类命令的副作用级别。
|
|
121
|
-
*/
|
|
122
|
-
export function classifyCommand(command) {
|
|
123
|
-
for (const dp of DESTRUCTIVE_PATTERNS) {
|
|
124
|
-
if (dp.pattern.test(command)) {
|
|
125
|
-
debug("运行安全", "检测到破坏性命令:", command);
|
|
126
|
-
return {
|
|
127
|
-
command,
|
|
128
|
-
risk: "destructive",
|
|
129
|
-
advisory: `检测到破坏性命令: ${dp.example} — 需要人工确认后方可执行`,
|
|
130
|
-
requires_human_confirm: true,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
for (const mp of MUTATING_PATTERNS) {
|
|
135
|
-
if (mp.pattern.test(command)) {
|
|
136
|
-
return {
|
|
137
|
-
command,
|
|
138
|
-
risk: "mutating",
|
|
139
|
-
advisory: `变更类命令: ${mp.example}`,
|
|
140
|
-
requires_human_confirm: false,
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return {
|
|
145
|
-
command,
|
|
146
|
-
risk: "read_only",
|
|
147
|
-
advisory: "只读命令",
|
|
148
|
-
requires_human_confirm: false,
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* 检查迁移契约 — 确保 schema 变更有回滚路径。
|
|
153
|
-
*/
|
|
154
|
-
export function checkMigrationContract(migration) {
|
|
155
|
-
const forwardClassified = classifyCommand(migration.forward_command);
|
|
156
|
-
const rollbackClassified = classifyCommand(migration.rollback_command);
|
|
157
|
-
if (!migration.rollback_command || migration.rollback_command.trim().length === 0) {
|
|
158
|
-
return {
|
|
159
|
-
migration_id: migration.migration_id,
|
|
160
|
-
has_rollback: false,
|
|
161
|
-
rollback_valid: false,
|
|
162
|
-
advisory: `迁移 "${migration.migration_id}" 缺少回滚命令 — 如果迁移失败需要手动恢复,建议补充 rollback_command`,
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
// 回滚命令应是正向操作的反向操作
|
|
166
|
-
const rollbackValid = migration.rollback_command.length > 0;
|
|
167
|
-
return {
|
|
168
|
-
migration_id: migration.migration_id,
|
|
169
|
-
has_rollback: true,
|
|
170
|
-
rollback_valid: rollbackValid,
|
|
171
|
-
advisory: `迁移 "${migration.migration_id}": 正向风险=${forwardClassified.risk}, 回滚风险=${rollbackClassified.risk}`,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
const LOCKFILE_NAMES = [
|
|
175
|
-
"package-lock.json",
|
|
176
|
-
"pnpm-lock.yaml",
|
|
177
|
-
"yarn.lock",
|
|
178
|
-
"go.sum",
|
|
179
|
-
"Cargo.lock",
|
|
180
|
-
];
|
|
181
|
-
/**
|
|
182
|
-
* 检查供应链安全 — 验证依赖有 lockfile 和完整性 hash。
|
|
183
|
-
* 此为轻量级检查,不读取实际文件内容。
|
|
184
|
-
*/
|
|
185
|
-
export function checkSupplyChain(rootDirFiles, dependencies) {
|
|
186
|
-
const hasLockfile = LOCKFILE_NAMES.some((lf) => rootDirFiles.includes(lf));
|
|
187
|
-
debug("运行安全", "检查供应链安全,依赖数:", dependencies.length, "lockfile:", hasLockfile);
|
|
188
|
-
const checks = dependencies.map((dep) => ({
|
|
189
|
-
package_name: dep.name,
|
|
190
|
-
version: dep.version,
|
|
191
|
-
has_lockfile: hasLockfile,
|
|
192
|
-
has_integrity_hash: hasLockfile, // lockfile 意味着存在完整性哈希
|
|
193
|
-
advisory: hasLockfile
|
|
194
|
-
? "已通过 lockfile 锁定,含完整性哈希"
|
|
195
|
-
: `${dep.name}@${dep.version} 未锁定 — 存在供应链风险,建议添加 lockfile`,
|
|
196
|
-
}));
|
|
197
|
-
const locked = checks.filter((c) => c.has_lockfile).length;
|
|
198
|
-
const unlocked = checks.length - locked;
|
|
199
|
-
return {
|
|
200
|
-
total_dependencies: dependencies.length,
|
|
201
|
-
locked_dependencies: locked,
|
|
202
|
-
unlocked_dependencies: unlocked,
|
|
203
|
-
checks,
|
|
204
|
-
advisory: unlocked > 0
|
|
205
|
-
? `${unlocked}/${dependencies.length} 个依赖未锁定 — 建议添加 lockfile 以保障供应链安全`
|
|
206
|
-
: `全部 ${dependencies.length} 个依赖已锁定`,
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
//# sourceMappingURL=runtime_safety.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime_safety.js","sourceRoot":"","sources":["../../../src/verify/audit/runtime_safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Semantic Evidence — 审计层模块。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:computeSemanticEvidence 等 审计层职责
|
|
6
|
-
* - 不负责:不属于本模块的职责由对应模块承担
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:发布门禁、质量检查
|
|
9
|
-
* 调用谁:logger、task、pipeline、delivery
|
|
10
|
-
*
|
|
11
|
-
* 数据流:审计输入(代码/配置) → 检查 → 评分/报告
|
|
12
|
-
* 持久化:无持久化(纯计算/内存态)
|
|
13
|
-
*/
|
|
14
|
-
import type { TaskContext } from "../../types/pipeline_types.js";
|
|
15
|
-
import type { RequirementPoint, SemanticEvidence } from "../../types/pipeline_types.js";
|
|
16
|
-
import type { DeliveryEvidenceChain } from "../../gate/types.js";
|
|
17
|
-
/**
|
|
18
|
-
* 从任务上下文计算语义证据。
|
|
19
|
-
* 基于变更文件和需求点,推断变更行为和需求覆盖状态。
|
|
20
|
-
* @param changedFiles - 变更文件路径列表
|
|
21
|
-
* @param requirementPoints - 需求点列表
|
|
22
|
-
* @param acceptanceResults - 可选的验收测试结果列表
|
|
23
|
-
* @returns 语义证据对象
|
|
24
|
-
*/
|
|
25
|
-
export declare function computeSemanticEvidence(changedFiles: string[], requirementPoints: RequirementPoint[], acceptanceResults?: Array<{
|
|
26
|
-
id: string;
|
|
27
|
-
passed: boolean;
|
|
28
|
-
}>): SemanticEvidence;
|
|
29
|
-
/**
|
|
30
|
-
* 从任务上下文构建完整交付证据链。
|
|
31
|
-
* 聚合 expand 的需求点、verify 的语义证据、execution 的变更文件。
|
|
32
|
-
* @param taskContext - 任务上下文
|
|
33
|
-
* @returns 完整交付证据链,无需求点且无变更文件时返回 null
|
|
34
|
-
*/
|
|
35
|
-
export declare function buildDeliveryEvidenceChain(taskContext: TaskContext): DeliveryEvidenceChain | null;
|
|
36
|
-
//# sourceMappingURL=semantic_evidence.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"semantic_evidence.d.ts","sourceRoot":"","sources":["../../../src/verify/audit/semantic_evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACxF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EAAE,EACtB,iBAAiB,EAAE,gBAAgB,EAAE,EACrC,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,GACzD,gBAAgB,CA4ClB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,WAAW,GACvB,qBAAqB,GAAG,IAAI,CAmC9B"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Semantic Evidence — 审计层模块。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:computeSemanticEvidence 等 审计层职责
|
|
6
|
-
* - 不负责:不属于本模块的职责由对应模块承担
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:发布门禁、质量检查
|
|
9
|
-
* 调用谁:logger、task、pipeline、delivery
|
|
10
|
-
*
|
|
11
|
-
* 数据流:审计输入(代码/配置) → 检查 → 评分/报告
|
|
12
|
-
* 持久化:无持久化(纯计算/内存态)
|
|
13
|
-
*/
|
|
14
|
-
import { debug } from "../../shared/logger.js";
|
|
15
|
-
/**
|
|
16
|
-
* 从任务上下文计算语义证据。
|
|
17
|
-
* 基于变更文件和需求点,推断变更行为和需求覆盖状态。
|
|
18
|
-
* @param changedFiles - 变更文件路径列表
|
|
19
|
-
* @param requirementPoints - 需求点列表
|
|
20
|
-
* @param acceptanceResults - 可选的验收测试结果列表
|
|
21
|
-
* @returns 语义证据对象
|
|
22
|
-
*/
|
|
23
|
-
export function computeSemanticEvidence(changedFiles, requirementPoints, acceptanceResults) {
|
|
24
|
-
debug("SemanticEvidence", "计算语义证据", "文件数:", changedFiles.length, "需求点:", requirementPoints.length);
|
|
25
|
-
const changedBehaviors = changedFiles.map((f) => {
|
|
26
|
-
const matchedReq = requirementPoints.find((rp) => rp.acceptance_test_ids?.some((tid) => f.toLowerCase().includes(tid.toLowerCase().replace(/[^a-z0-9]/g, ""))));
|
|
27
|
-
return {
|
|
28
|
-
file_path: f,
|
|
29
|
-
description: `modified: ${f}`,
|
|
30
|
-
requirement_point_id: matchedReq?.id,
|
|
31
|
-
};
|
|
32
|
-
});
|
|
33
|
-
const requirementCoverage = requirementPoints.map((rp) => {
|
|
34
|
-
const hasMatchingFile = changedBehaviors.some((cb) => cb.requirement_point_id === rp.id);
|
|
35
|
-
const acceptancePassed = acceptanceResults?.filter((ar) => rp.acceptance_test_ids?.includes(ar.id));
|
|
36
|
-
const allAcceptancePassed = acceptancePassed
|
|
37
|
-
? acceptancePassed.length > 0 && acceptancePassed.every((a) => a.passed)
|
|
38
|
-
: false;
|
|
39
|
-
const covered = hasMatchingFile || allAcceptancePassed;
|
|
40
|
-
return {
|
|
41
|
-
requirement_point_id: rp.id,
|
|
42
|
-
covered,
|
|
43
|
-
evidence: covered
|
|
44
|
-
? hasMatchingFile
|
|
45
|
-
? "file change matched"
|
|
46
|
-
: "acceptance tests passed"
|
|
47
|
-
: "no matching evidence",
|
|
48
|
-
};
|
|
49
|
-
});
|
|
50
|
-
return {
|
|
51
|
-
changed_behaviors: changedBehaviors,
|
|
52
|
-
unchanged_assertions: [],
|
|
53
|
-
requirement_coverage: requirementCoverage,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 从任务上下文构建完整交付证据链。
|
|
58
|
-
* 聚合 expand 的需求点、verify 的语义证据、execution 的变更文件。
|
|
59
|
-
* @param taskContext - 任务上下文
|
|
60
|
-
* @returns 完整交付证据链,无需求点且无变更文件时返回 null
|
|
61
|
-
*/
|
|
62
|
-
export function buildDeliveryEvidenceChain(taskContext) {
|
|
63
|
-
debug("SemanticEvidence", "构建交付证据链");
|
|
64
|
-
const requirementPoints = taskContext.expansion?.requirement_points ?? [];
|
|
65
|
-
const changedFiles = taskContext.execution?.changed_files ?? [];
|
|
66
|
-
if (requirementPoints.length === 0 && changedFiles.length === 0) {
|
|
67
|
-
debug("SemanticEvidence", "无需求点且无变更文件,无法构建证据链");
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
// ctx.verification 已删(死字段,从不写入)— semantic 覆盖数据不可得:
|
|
71
|
-
// 文件↔需求映射留空、需求点全标未覆盖(反映真实:无验证语义证据)。
|
|
72
|
-
const fileToRequirements = changedFiles.map((f) => ({
|
|
73
|
-
file_path: f,
|
|
74
|
-
requirement_point_ids: [],
|
|
75
|
-
}));
|
|
76
|
-
const uncoveredPoints = requirementPoints.map((rp) => rp.id);
|
|
77
|
-
return {
|
|
78
|
-
requirement_points: requirementPoints,
|
|
79
|
-
semantic_evidence: undefined,
|
|
80
|
-
file_to_requirements: fileToRequirements,
|
|
81
|
-
completeness: {
|
|
82
|
-
all_requirements_covered: uncoveredPoints.length === 0,
|
|
83
|
-
uncovered_points: uncoveredPoints,
|
|
84
|
-
advisory: uncoveredPoints.length > 0
|
|
85
|
-
? `advisory: ${uncoveredPoints.length} requirement point(s) not covered by evidence: ${uncoveredPoints.join(", ")}`
|
|
86
|
-
: "all requirement points covered",
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=semantic_evidence.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"semantic_evidence.js","sourceRoot":"","sources":["../../../src/verify/audit/semantic_evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test Generator — 审计层模块。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:generateTestGuide 等 审计层职责
|
|
6
|
-
* - 不负责:不属于本模块的职责由对应模块承担
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:发布门禁、质量检查
|
|
9
|
-
* 调用谁:node:path、index、logger
|
|
10
|
-
*
|
|
11
|
-
* 数据流:审计输入(代码/配置) → 检查 → 评分/报告
|
|
12
|
-
* 持久化:无持久化(纯计算/内存态)
|
|
13
|
-
*/
|
|
14
|
-
import type { TestGenGuide, ProjectConfig } from "../../types/index.js";
|
|
15
|
-
/**
|
|
16
|
-
* 为变更文件生成测试引导 — 根据文件类型匹配测试策略,叠加知识驱动场景。
|
|
17
|
-
* @param changedFiles - 变更文件路径列表
|
|
18
|
-
* @param knowledgePatterns - 从知识库提取的关键词模式列表
|
|
19
|
-
* @param _config - 项目配置(预留,当前未使用)
|
|
20
|
-
* @returns 测试引导数组,每项包含测试类型、测试文件建议路径、场景列表和 Mock 要点
|
|
21
|
-
*/
|
|
22
|
-
export declare function generateTestGuide(changedFiles: string[], knowledgePatterns: string[], _config: ProjectConfig): TestGenGuide[];
|
|
23
|
-
//# sourceMappingURL=test_generator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test_generator.d.ts","sourceRoot":"","sources":["../../../src/verify/audit/test_generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAgB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAqMtF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EAAE,EACtB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,aAAa,GACrB,YAAY,EAAE,CAqChB"}
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test Generator — 审计层模块。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:generateTestGuide 等 审计层职责
|
|
6
|
-
* - 不负责:不属于本模块的职责由对应模块承担
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:发布门禁、质量检查
|
|
9
|
-
* 调用谁:node:path、index、logger
|
|
10
|
-
*
|
|
11
|
-
* 数据流:审计输入(代码/配置) → 检查 → 评分/报告
|
|
12
|
-
* 持久化:无持久化(纯计算/内存态)
|
|
13
|
-
*/
|
|
14
|
-
import path from "node:path";
|
|
15
|
-
import { debug } from "../../shared/logger.js";
|
|
16
|
-
/** 文件类型 → 测试策略映射表: 根据文件名模式匹配测试类型、夹具方式和 Mock 策略 */
|
|
17
|
-
const FILE_TEST_MAP = [
|
|
18
|
-
{
|
|
19
|
-
pattern: /Controller\.java$/,
|
|
20
|
-
test_type: "integration",
|
|
21
|
-
fixture: "@SpringBootTest + MockMvc",
|
|
22
|
-
mock: "@MockBean Service 层依赖",
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
pattern: /Service\.java$/,
|
|
26
|
-
test_type: "unit",
|
|
27
|
-
fixture: "@ExtendWith(MockitoExtension)",
|
|
28
|
-
mock: "@Mock Mapper/Repository 层依赖",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
pattern: /Mapper\.java$|Repository\.java$/,
|
|
32
|
-
test_type: "integration",
|
|
33
|
-
fixture: "@MybatisTest / @DataJpaTest",
|
|
34
|
-
mock: "测试数据库或 H2 内存库",
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
pattern: /api\/|route/,
|
|
38
|
-
test_type: "e2e",
|
|
39
|
-
fixture: "supertest(app)",
|
|
40
|
-
mock: "数据库和外部服务模拟",
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
pattern: /\.tsx?$/,
|
|
44
|
-
test_type: "unit",
|
|
45
|
-
fixture: "render() + fireEvent()",
|
|
46
|
-
mock: "jest.mock() 模拟外部依赖",
|
|
47
|
-
},
|
|
48
|
-
];
|
|
49
|
-
// ────────────────────────────────────────────
|
|
50
|
-
// 各测试类型的默认场景
|
|
51
|
-
// ────────────────────────────────────────────
|
|
52
|
-
/** 各测试类型的默认场景集 — 单元/集成/E2E 测试的 Given-When-Then 标准场景 */
|
|
53
|
-
const DEFAULT_SCENARIOS = {
|
|
54
|
-
unit: [
|
|
55
|
-
{
|
|
56
|
-
name: "正常输入返回预期结果",
|
|
57
|
-
given: "输入合法的参数",
|
|
58
|
-
when: "调用被测函数/方法",
|
|
59
|
-
then: "返回值符合预期",
|
|
60
|
-
priority: "high",
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
name: "空值/null 输入正确处理",
|
|
64
|
-
given: "输入为 null / undefined / 空字符串",
|
|
65
|
-
when: "调用被测函数/方法",
|
|
66
|
-
then: "抛出异常或返回安全的默认值",
|
|
67
|
-
priority: "high",
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
name: "边界条件处理",
|
|
71
|
-
given: "输入处于边界值 (如 0, MAX_VALUE, 空数组)",
|
|
72
|
-
when: "调用被测函数/方法",
|
|
73
|
-
then: "返回值符合边界约定",
|
|
74
|
-
priority: "medium",
|
|
75
|
-
},
|
|
76
|
-
],
|
|
77
|
-
integration: [
|
|
78
|
-
{
|
|
79
|
-
name: "完整请求链路返回正确状态码",
|
|
80
|
-
given: "发起一个完整的 HTTP 请求",
|
|
81
|
-
when: "请求经过 Controller → Service → Mapper/Repository",
|
|
82
|
-
then: "返回正确的状态码和响应体",
|
|
83
|
-
priority: "high",
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
name: "数据持久化后可正确查询",
|
|
87
|
-
given: "通过接口写入一条数据",
|
|
88
|
-
when: "查询相同条件",
|
|
89
|
-
then: "能正确检索到写入的数据",
|
|
90
|
-
priority: "high",
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
name: "异常输入返回适当错误码",
|
|
94
|
-
given: "发送格式错误或非法参数的请求",
|
|
95
|
-
when: "请求经过各层处理",
|
|
96
|
-
then: "返回 400/422 等适当的错误状态码和错误信息",
|
|
97
|
-
priority: "medium",
|
|
98
|
-
},
|
|
99
|
-
],
|
|
100
|
-
e2e: [
|
|
101
|
-
{
|
|
102
|
-
name: "用户完整操作流程畅通",
|
|
103
|
-
given: "用户处于初始状态",
|
|
104
|
-
when: "执行完整的用户操作链路",
|
|
105
|
-
then: "最终状态符合预期",
|
|
106
|
-
priority: "high",
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
name: "错误状态正确展示",
|
|
110
|
-
given: "用户触发一个错误场景",
|
|
111
|
-
when: "页面渲染错误响应",
|
|
112
|
-
then: "错误信息正确展示且不影响其他功能",
|
|
113
|
-
priority: "medium",
|
|
114
|
-
},
|
|
115
|
-
],
|
|
116
|
-
};
|
|
117
|
-
/** 知识关键词 → 额外测试场景映射表: 当文件路径或知识模式包含关键词时自动追加场景 */
|
|
118
|
-
const KNOWLEDGE_SCENARIOS = [
|
|
119
|
-
{
|
|
120
|
-
keywords: ["并发", "concurrent", "thread", "lock", "mutex", "race"],
|
|
121
|
-
scenario: {
|
|
122
|
-
name: "并发场景下数据一致性",
|
|
123
|
-
given: "多个请求同时操作同一资源",
|
|
124
|
-
when: "并发执行",
|
|
125
|
-
then: "数据保持一致性,无脏写",
|
|
126
|
-
priority: "high",
|
|
127
|
-
},
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
keywords: ["权限", "permission", "auth", "rbac", "role"],
|
|
131
|
-
scenario: {
|
|
132
|
-
name: "权限校验正确拦截非法访问",
|
|
133
|
-
given: "用户无对应操作权限",
|
|
134
|
-
when: "尝试访问受限资源",
|
|
135
|
-
then: "返回 403 或抛出权限异常",
|
|
136
|
-
priority: "high",
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
keywords: ["缓存", "cache", "redis", "expire", "ttl"],
|
|
141
|
-
scenario: {
|
|
142
|
-
name: "缓存命中与未命中行为一致",
|
|
143
|
-
given: "同一请求首次和后续调用",
|
|
144
|
-
when: "缓存从空到有再到过期",
|
|
145
|
-
then: "业务结果一致",
|
|
146
|
-
priority: "medium",
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
keywords: ["分页", "pagination", "page", "limit", "offset"],
|
|
151
|
-
scenario: {
|
|
152
|
-
name: "分页参数边界验证",
|
|
153
|
-
given: "传入 page=0, page=-1, limit=0 等非法分页参数",
|
|
154
|
-
when: "执行分页查询",
|
|
155
|
-
then: "返回合理结果或参数校验错误",
|
|
156
|
-
priority: "medium",
|
|
157
|
-
},
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
keywords: ["文件上传", "upload", "multipart", "attachment"],
|
|
161
|
-
scenario: {
|
|
162
|
-
name: "文件大小和格式校验",
|
|
163
|
-
given: "上传超大文件或非法格式文件",
|
|
164
|
-
when: "执行上传操作",
|
|
165
|
-
then: "返回明确的校验错误信息",
|
|
166
|
-
priority: "high",
|
|
167
|
-
},
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
keywords: ["事务", "transaction", "rollback", "commit"],
|
|
171
|
-
scenario: {
|
|
172
|
-
name: "事务回滚后数据恢复原状",
|
|
173
|
-
given: "操作执行过程中发生异常",
|
|
174
|
-
when: "事务触发回滚",
|
|
175
|
-
then: "所有变更被正确撤销",
|
|
176
|
-
priority: "high",
|
|
177
|
-
},
|
|
178
|
-
},
|
|
179
|
-
];
|
|
180
|
-
/**
|
|
181
|
-
* 为变更文件生成测试引导 — 根据文件类型匹配测试策略,叠加知识驱动场景。
|
|
182
|
-
* @param changedFiles - 变更文件路径列表
|
|
183
|
-
* @param knowledgePatterns - 从知识库提取的关键词模式列表
|
|
184
|
-
* @param _config - 项目配置(预留,当前未使用)
|
|
185
|
-
* @returns 测试引导数组,每项包含测试类型、测试文件建议路径、场景列表和 Mock 要点
|
|
186
|
-
*/
|
|
187
|
-
export function generateTestGuide(changedFiles, knowledgePatterns, _config) {
|
|
188
|
-
debug("测试生成", "generateTestGuide() 开始, ${changedFiles.length} 个变更文件, ${knowledgePatterns.length} 个知识模式");
|
|
189
|
-
const guides = [];
|
|
190
|
-
for (const file of changedFiles) {
|
|
191
|
-
// 匹配 FILE_TEST_MAP
|
|
192
|
-
const mapping = matchFileTestMapping(file);
|
|
193
|
-
if (!mapping) {
|
|
194
|
-
debug("测试生成", "文件 ${file} 未匹配测试策略,跳过");
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
// 确定测试文件建议路径
|
|
198
|
-
const testFileSuggestion = suggestTestFilePath(file, mapping.test_type);
|
|
199
|
-
// 该测试类型的基础场景
|
|
200
|
-
const scenarios = structuredClone(DEFAULT_SCENARIOS[mapping.test_type]);
|
|
201
|
-
// 如果关键词匹配则追加知识驱动场景
|
|
202
|
-
const extraScenarios = matchKnowledgeScenarios(file, knowledgePatterns);
|
|
203
|
-
if (extraScenarios.length > 0) {
|
|
204
|
-
debug("测试生成", "文件 ${file} 追加 ${extraScenarios.length} 个知识驱动场景");
|
|
205
|
-
}
|
|
206
|
-
scenarios.push(...extraScenarios);
|
|
207
|
-
guides.push({
|
|
208
|
-
source_file: file,
|
|
209
|
-
test_type: mapping.test_type,
|
|
210
|
-
test_file_suggestion: testFileSuggestion,
|
|
211
|
-
scenarios,
|
|
212
|
-
fixtures_needed: [mapping.fixture],
|
|
213
|
-
mock_points: [mapping.mock],
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
debug("测试生成", "生成 ${guides.length} 个测试引导");
|
|
217
|
-
return guides;
|
|
218
|
-
}
|
|
219
|
-
// ────────────────────────────────────────────
|
|
220
|
-
// 内部辅助函数
|
|
221
|
-
// ────────────────────────────────────────────
|
|
222
|
-
/** 根据文件路径匹配测试策略 — 遍历 FILE_TEST_MAP 返回首个命中的映射规则 */
|
|
223
|
-
function matchFileTestMapping(filePath) {
|
|
224
|
-
for (const mapping of FILE_TEST_MAP) {
|
|
225
|
-
if (mapping.pattern.test(filePath)) {
|
|
226
|
-
return mapping;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return null;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* 推荐测试文件路径 — Java 文件遵循 src/main → src/test 和 *Test.java 命名约定,TS/JS 文件追加 .test 后缀。
|
|
233
|
-
* @param sourceFile - 源文件路径
|
|
234
|
-
* @param testType - 测试类型(用于未来扩展不同约定)
|
|
235
|
-
* @returns 推荐的测试文件路径
|
|
236
|
-
*/
|
|
237
|
-
function suggestTestFilePath(sourceFile, _testType) {
|
|
238
|
-
const ext = path.extname(sourceFile);
|
|
239
|
-
const base = sourceFile.slice(0, -ext.length);
|
|
240
|
-
if (ext === ".java") {
|
|
241
|
-
// Java 约定: ClassName → ClassNameTest,src/main/java → src/test/java
|
|
242
|
-
const dir = path.dirname(sourceFile);
|
|
243
|
-
const fileName = path.basename(sourceFile, ext);
|
|
244
|
-
const testDir = dir
|
|
245
|
-
.replace(/(^|\/)src\/main\/java(\/|$)/, "$1src/test/java$2")
|
|
246
|
-
.replace(/(^|\/)src\/main\/kotlin(\/|$)/, "$1src/test/kotlin$2");
|
|
247
|
-
return path.join(testDir, `${fileName}Test.java`);
|
|
248
|
-
}
|
|
249
|
-
// TypeScript / JavaScript: *.ts → *.test.ts,*.tsx → *.test.tsx(测试文件命名映射)
|
|
250
|
-
const testExt = `.test${ext}`;
|
|
251
|
-
return `${base}${testExt}`;
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* 匹配知识驱动的额外测试场景 — 将文件路径和知识模式拼接后搜索关键词命中。
|
|
255
|
-
* @param file - 源文件路径(用于关键词匹配)
|
|
256
|
-
* @param knowledgePatterns - 知识库关键词列表
|
|
257
|
-
* @returns 命中的额外测试场景数组(自动去重)
|
|
258
|
-
*/
|
|
259
|
-
function matchKnowledgeScenarios(file, knowledgePatterns) {
|
|
260
|
-
const matched = [];
|
|
261
|
-
const seenNames = new Set();
|
|
262
|
-
// 将文件路径与所有知识关键词拼接为搜索文本,统一转小写进行匹配
|
|
263
|
-
const searchText = (file + " " + knowledgePatterns.join(" ")).toLowerCase();
|
|
264
|
-
for (const entry of KNOWLEDGE_SCENARIOS) {
|
|
265
|
-
if (seenNames.has(entry.scenario.name)) {
|
|
266
|
-
continue;
|
|
267
|
-
}
|
|
268
|
-
for (const keyword of entry.keywords) {
|
|
269
|
-
if (searchText.includes(keyword.toLowerCase())) {
|
|
270
|
-
matched.push(structuredClone(entry.scenario));
|
|
271
|
-
seenNames.add(entry.scenario.name);
|
|
272
|
-
break;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
return matched;
|
|
277
|
-
}
|
|
278
|
-
//# sourceMappingURL=test_generator.js.map
|