autosnippet 3.3.4 → 3.3.6
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 +174 -83
- package/config/constitution.yaml +2 -0
- package/dashboard/dist/assets/icons-D1aVZYFW.js +1 -0
- package/dashboard/dist/assets/index-CxHOu8Hd.css +1 -0
- package/dashboard/dist/assets/index-DDdAOpYT.js +128 -0
- package/dashboard/dist/index.html +3 -3
- package/dist/bin/api-server.js +1 -0
- package/dist/bin/cli.d.ts +1 -0
- package/dist/bin/cli.js +136 -9
- package/dist/lib/agent/AgentFactory.d.ts +0 -17
- package/dist/lib/agent/AgentFactory.js +1 -25
- package/dist/lib/agent/capabilities.d.ts +11 -0
- package/dist/lib/agent/capabilities.js +29 -5
- package/dist/lib/agent/context/ExplorationTracker.js +10 -1
- package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
- package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
- package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
- package/dist/lib/agent/domain/insight-analyst.js +111 -11
- package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
- package/dist/lib/agent/domain/insight-evolver.js +230 -0
- package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
- package/dist/lib/agent/domain/insight-gate.js +41 -0
- package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
- package/dist/lib/agent/domain/insight-producer.js +60 -5
- package/dist/lib/agent/domain/scan-prompts.js +10 -7
- package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
- package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
- package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
- package/dist/lib/agent/memory/SessionStore.js +9 -15
- package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
- package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
- package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
- package/dist/lib/agent/memory/session-store-schema.js +41 -0
- package/dist/lib/agent/presets.d.ts +89 -1
- package/dist/lib/agent/presets.js +53 -5
- package/dist/lib/agent/tools/_shared.d.ts +7 -15
- package/dist/lib/agent/tools/_shared.js +20 -21
- package/dist/lib/agent/tools/composite.d.ts +25 -22
- package/dist/lib/agent/tools/composite.js +108 -109
- package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
- package/dist/lib/agent/tools/evolution-tools.js +161 -0
- package/dist/lib/agent/tools/index.d.ts +163 -92
- package/dist/lib/agent/tools/index.js +9 -1
- package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
- package/dist/lib/agent/tools/lifecycle.js +59 -75
- package/dist/lib/cli/AiScanService.js +1 -1
- package/dist/lib/cli/KnowledgeSyncService.d.ts +5 -1
- package/dist/lib/cli/KnowledgeSyncService.js +6 -3
- package/dist/lib/core/AstAnalyzer.d.ts +1 -0
- package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
- package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
- package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
- package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
- package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
- package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
- package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
- package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
- package/dist/lib/domain/dimension/index.d.ts +10 -0
- package/dist/lib/domain/dimension/index.js +9 -0
- package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
- package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
- package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +33 -111
- package/dist/lib/domain/knowledge/KnowledgeEntry.js +27 -6
- package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
- package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
- package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
- package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
- package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
- package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
- package/dist/lib/domain/knowledge/values/Stats.d.ts +1 -1
- package/dist/lib/domain/knowledge/values/Stats.js +2 -2
- package/dist/lib/external/mcp/McpServer.js +4 -0
- package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
- package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
- package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
- package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
- package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
- package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +172 -161
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
- package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
- package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +14 -10
- package/dist/lib/external/mcp/handlers/bootstrap-external.js +39 -51
- package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
- package/dist/lib/external/mcp/handlers/bootstrap-internal.js +115 -82
- package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
- package/dist/lib/external/mcp/handlers/consolidated.js +115 -162
- package/dist/lib/external/mcp/handlers/dimension-complete-external.js +69 -1
- package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
- package/dist/lib/external/mcp/handlers/evolve-external.js +226 -0
- package/dist/lib/external/mcp/handlers/knowledge.js +26 -2
- package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
- package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
- package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
- package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
- package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
- package/dist/lib/external/mcp/handlers/search.js +6 -5
- package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
- package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
- package/dist/lib/external/mcp/tools.d.ts +8 -18
- package/dist/lib/external/mcp/tools.js +60 -3
- package/dist/lib/http/routes/knowledge.js +122 -1
- package/dist/lib/http/routes/modules.js +25 -3
- package/dist/lib/http/routes/panorama.js +16 -4
- package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
- package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
- package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
- package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
- package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
- package/dist/lib/injection/ServiceContainer.js +55 -0
- package/dist/lib/injection/ServiceMap.d.ts +8 -1
- package/dist/lib/injection/modules/InfraModule.js +4 -1
- package/dist/lib/injection/modules/KnowledgeModule.js +38 -1
- package/dist/lib/repository/evolution/ProposalRepository.d.ts +99 -0
- package/dist/lib/repository/evolution/ProposalRepository.js +255 -0
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
- package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
- package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
- package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
- package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
- package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +22 -4
- package/dist/lib/service/bootstrap/UiStartupTasks.js +73 -5
- package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
- package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
- package/dist/lib/service/cleanup/CleanupService.d.ts +85 -0
- package/dist/lib/service/cleanup/CleanupService.js +324 -0
- package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
- package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
- package/dist/lib/service/delivery/FileProtection.js +54 -0
- package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
- package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
- package/dist/lib/service/evolution/ContentPatcher.js +310 -0
- package/dist/lib/service/evolution/DecayDetector.d.ts +4 -3
- package/dist/lib/service/evolution/DecayDetector.js +97 -22
- package/dist/lib/service/evolution/KnowledgeMetabolism.d.ts +4 -2
- package/dist/lib/service/evolution/KnowledgeMetabolism.js +29 -2
- package/dist/lib/service/evolution/ProposalExecutor.d.ts +66 -0
- package/dist/lib/service/evolution/ProposalExecutor.js +424 -0
- package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
- package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
- package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
- package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
- package/dist/lib/service/evolution/StagingManager.js +5 -3
- package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
- package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
- package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
- package/dist/lib/service/guard/ComplianceReporter.js +51 -0
- package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
- package/dist/lib/service/guard/GuardCrossFileChecks.js +2 -0
- package/dist/lib/service/guard/ReverseGuard.d.ts +1 -1
- package/dist/lib/service/guard/ReverseGuard.js +32 -2
- package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
- package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
- package/dist/lib/service/knowledge/KnowledgeService.js +44 -4
- package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
- package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
- package/dist/lib/service/knowledge/SourceRefReconciler.d.ts +2 -0
- package/dist/lib/service/knowledge/SourceRefReconciler.js +48 -0
- package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +3 -2
- package/dist/lib/service/panorama/DimensionAnalyzer.js +15 -140
- package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
- package/dist/lib/service/search/SearchEngine.d.ts +11 -10
- package/dist/lib/service/search/SearchEngine.js +38 -36
- package/dist/lib/service/search/SearchTypes.d.ts +14 -8
- package/dist/lib/service/search/SearchTypes.js +1 -1
- package/dist/lib/service/search/tokenizer.d.ts +1 -1
- package/dist/lib/service/search/tokenizer.js +2 -2
- package/dist/lib/shared/schemas/common.d.ts +4 -4
- package/dist/lib/shared/schemas/http-requests.d.ts +12 -1
- package/dist/lib/shared/schemas/http-requests.js +8 -0
- package/dist/lib/shared/schemas/mcp-tools.d.ts +33 -2
- package/dist/lib/shared/schemas/mcp-tools.js +42 -0
- package/dist/lib/types/evolution.d.ts +135 -0
- package/dist/lib/types/evolution.js +6 -0
- package/dist/lib/types/graph-shared.d.ts +25 -0
- package/dist/lib/types/graph-shared.js +7 -0
- package/dist/lib/types/knowledge-wire.d.ts +131 -0
- package/dist/lib/types/knowledge-wire.js +7 -0
- package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
- package/dist/lib/types/project-snapshot-builder.js +189 -0
- package/dist/lib/types/project-snapshot.d.ts +399 -0
- package/dist/lib/types/project-snapshot.js +17 -0
- package/dist/lib/types/search-wire.d.ts +46 -0
- package/dist/lib/types/search-wire.js +7 -0
- package/dist/lib/types/snapshot-views.d.ts +58 -0
- package/dist/lib/types/snapshot-views.js +103 -0
- package/package.json +1 -1
- package/skills/autosnippet-recipes/SKILL.md +1 -1
- package/templates/instructions/agent-static.md +2 -0
- package/templates/instructions/conventions.md +3 -1
- package/templates/recipes-setup/README.md +2 -2
- package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
- package/dashboard/dist/assets/index-B659K9t5.js +0 -128
- package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
|
@@ -29,7 +29,7 @@ export class BootstrapSession {
|
|
|
29
29
|
completedDimensions;
|
|
30
30
|
crossDimensionHints;
|
|
31
31
|
dimensions;
|
|
32
|
-
|
|
32
|
+
snapshotCache;
|
|
33
33
|
sessionStore;
|
|
34
34
|
submissionTracker;
|
|
35
35
|
/**
|
|
@@ -46,7 +46,7 @@ export class BootstrapSession {
|
|
|
46
46
|
/** 外部 Agent 提交追踪 (v2: 对标内部 Agent 的 EvidenceCollector) */
|
|
47
47
|
this.submissionTracker = new ExternalSubmissionTracker();
|
|
48
48
|
/** Phase 1-4 分析结果缓存,供 wiki_plan 复用 */
|
|
49
|
-
this.
|
|
49
|
+
this.snapshotCache = null;
|
|
50
50
|
/** 跨维度 hints 收集 */
|
|
51
51
|
this.crossDimensionHints = {}; // targetDimId → [{ fromDim, hint }]
|
|
52
52
|
this._activeSession = null;
|
|
@@ -136,17 +136,17 @@ export class BootstrapSession {
|
|
|
136
136
|
}
|
|
137
137
|
return accumulated;
|
|
138
138
|
}
|
|
139
|
-
// ──
|
|
139
|
+
// ── Snapshot 缓存 ──────────────────────────────────────────
|
|
140
140
|
/**
|
|
141
|
-
* 缓存 Phase 1-4
|
|
142
|
-
* @param cache
|
|
141
|
+
* 缓存 Phase 1-4 分析结果(ProjectSnapshot 的 session cache 形式)
|
|
142
|
+
* @param cache toSessionCache(snapshot) 的返回值
|
|
143
143
|
*/
|
|
144
|
-
|
|
145
|
-
this.
|
|
144
|
+
setSnapshotCache(cache) {
|
|
145
|
+
this.snapshotCache = cache;
|
|
146
146
|
}
|
|
147
|
-
/** 获取
|
|
148
|
-
|
|
149
|
-
return this.
|
|
147
|
+
/** 获取 Snapshot 缓存(wiki_plan / dimension-complete 复用) */
|
|
148
|
+
getSnapshotCache() {
|
|
149
|
+
return this.snapshotCache;
|
|
150
150
|
}
|
|
151
151
|
// ── 序列化 ────────────────────────────────────────────────
|
|
152
152
|
toJSON() {
|
|
@@ -162,5 +162,12 @@ export declare class ExternalSubmissionTracker {
|
|
|
162
162
|
negativeSignals: number;
|
|
163
163
|
usedTriggers: number;
|
|
164
164
|
};
|
|
165
|
+
/**
|
|
166
|
+
* 获取所有已提交候选的标题集合(小写,用于跨维度硬去重)
|
|
167
|
+
*
|
|
168
|
+
* @param [excludeDimId] 可选,排除指定维度的标题
|
|
169
|
+
* @returns Set<string> 小写标题集合
|
|
170
|
+
*/
|
|
171
|
+
getAllSubmittedTitles(excludeDimId?: string): Set<string>;
|
|
165
172
|
}
|
|
166
173
|
export default ExternalSubmissionTracker;
|
|
@@ -288,5 +288,25 @@ export class ExternalSubmissionTracker {
|
|
|
288
288
|
usedTriggers: this.#usedTriggers.size,
|
|
289
289
|
};
|
|
290
290
|
}
|
|
291
|
+
/**
|
|
292
|
+
* 获取所有已提交候选的标题集合(小写,用于跨维度硬去重)
|
|
293
|
+
*
|
|
294
|
+
* @param [excludeDimId] 可选,排除指定维度的标题
|
|
295
|
+
* @returns Set<string> 小写标题集合
|
|
296
|
+
*/
|
|
297
|
+
getAllSubmittedTitles(excludeDimId) {
|
|
298
|
+
const titles = new Set();
|
|
299
|
+
for (const [dimId, submissions] of this.#dimensionSubmissions) {
|
|
300
|
+
if (excludeDimId && dimId === excludeDimId) {
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
for (const sub of submissions) {
|
|
304
|
+
if (sub.title) {
|
|
305
|
+
titles.add(sub.title.toLowerCase().trim());
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return titles;
|
|
310
|
+
}
|
|
291
311
|
}
|
|
292
312
|
export default ExternalSubmissionTracker;
|
|
@@ -13,126 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* @module bootstrap/MissionBriefingBuilder
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
|
-
interface DimensionDef {
|
|
18
|
-
id: string;
|
|
19
|
-
label?: string;
|
|
20
|
-
guide?: string;
|
|
21
|
-
knowledgeTypes?: string[];
|
|
22
|
-
skillWorthy?: boolean;
|
|
23
|
-
skillMeta?: {
|
|
24
|
-
name: string;
|
|
25
|
-
description: string;
|
|
26
|
-
};
|
|
27
|
-
dualOutput?: boolean;
|
|
28
|
-
tierHint?: number;
|
|
29
|
-
}
|
|
30
|
-
/** AST 类信息 */
|
|
31
|
-
interface AstClassInfo {
|
|
32
|
-
name: string;
|
|
33
|
-
superclass?: string;
|
|
34
|
-
methodCount?: number;
|
|
35
|
-
methods?: unknown[];
|
|
36
|
-
protocols?: string[];
|
|
37
|
-
conformedProtocols?: string[];
|
|
38
|
-
file?: string;
|
|
39
|
-
relativePath?: string;
|
|
40
|
-
}
|
|
41
|
-
/** AST 协议信息 */
|
|
42
|
-
interface AstProtocolInfo {
|
|
43
|
-
name: string;
|
|
44
|
-
file?: string;
|
|
45
|
-
relativePath?: string;
|
|
46
|
-
methodCount?: number;
|
|
47
|
-
methods?: unknown[];
|
|
48
|
-
conformers?: string[];
|
|
49
|
-
}
|
|
50
|
-
/** AST Category 信息 */
|
|
51
|
-
interface AstCategoryInfo {
|
|
52
|
-
baseClass?: string;
|
|
53
|
-
extendedClass?: string;
|
|
54
|
-
name: string;
|
|
55
|
-
file?: string;
|
|
56
|
-
relativePath?: string;
|
|
57
|
-
methods?: (string | {
|
|
58
|
-
name: string;
|
|
59
|
-
})[];
|
|
60
|
-
}
|
|
61
|
-
/** AST 方法信息 */
|
|
62
|
-
interface AstMethodInfo {
|
|
63
|
-
name: string;
|
|
64
|
-
className?: string;
|
|
65
|
-
isAsync?: boolean;
|
|
66
|
-
}
|
|
67
|
-
/** AST 文件摘要 */
|
|
68
|
-
interface AstFileSummary {
|
|
69
|
-
exports?: unknown[];
|
|
70
|
-
methods?: AstMethodInfo[];
|
|
71
|
-
}
|
|
72
|
-
/** 项目度量 */
|
|
73
|
-
interface ProjectMetrics {
|
|
74
|
-
totalMethods?: number;
|
|
75
|
-
complexMethods?: unknown[];
|
|
76
|
-
longMethods?: unknown[];
|
|
77
|
-
avgMethodsPerClass?: number;
|
|
78
|
-
maxNestingDepth?: number;
|
|
79
|
-
}
|
|
80
|
-
/** AST 项目摘要 */
|
|
81
|
-
interface AstProjectSummary {
|
|
82
|
-
classes?: AstClassInfo[];
|
|
83
|
-
protocols?: AstProtocolInfo[];
|
|
84
|
-
categories?: AstCategoryInfo[];
|
|
85
|
-
fileSummaries?: AstFileSummary[];
|
|
86
|
-
patternStats?: Record<string, unknown>;
|
|
87
|
-
projectMetrics?: ProjectMetrics;
|
|
88
|
-
fileCount?: number;
|
|
89
|
-
}
|
|
90
|
-
/** Guard 违规条目 */
|
|
91
|
-
interface GuardViolationEntry {
|
|
92
|
-
ruleId: string;
|
|
93
|
-
message?: string;
|
|
94
|
-
line?: number;
|
|
95
|
-
locations?: {
|
|
96
|
-
filePath: string;
|
|
97
|
-
line?: number;
|
|
98
|
-
}[];
|
|
99
|
-
}
|
|
100
|
-
/** Guard 审计文件条目 */
|
|
101
|
-
interface GuardAuditFileEntry {
|
|
102
|
-
filePath: string;
|
|
103
|
-
violations?: GuardViolationEntry[];
|
|
104
|
-
}
|
|
105
|
-
/** Guard 审计结果 (用于 Briefing) */
|
|
106
|
-
interface GuardAuditForBriefing {
|
|
107
|
-
files?: GuardAuditFileEntry[];
|
|
108
|
-
summary?: {
|
|
109
|
-
totalErrors?: number;
|
|
110
|
-
totalViolations?: number;
|
|
111
|
-
};
|
|
112
|
-
crossFileViolations?: GuardViolationEntry[];
|
|
113
|
-
}
|
|
114
|
-
/** 依赖图节点 */
|
|
115
|
-
interface DepGraphNode {
|
|
116
|
-
id?: string;
|
|
117
|
-
label?: string;
|
|
118
|
-
fileCount?: number;
|
|
119
|
-
}
|
|
120
|
-
/** 依赖图数据 */
|
|
121
|
-
interface DepGraphData {
|
|
122
|
-
nodes?: (string | DepGraphNode)[];
|
|
123
|
-
edges?: unknown[];
|
|
124
|
-
}
|
|
125
|
-
/** Code Entity 结果 */
|
|
126
|
-
interface CodeEntityResult {
|
|
127
|
-
entitiesUpserted?: number;
|
|
128
|
-
edgesCreated?: number;
|
|
129
|
-
}
|
|
130
|
-
/** Call Graph 结果 */
|
|
131
|
-
interface CallGraphResult {
|
|
132
|
-
entitiesUpserted?: number;
|
|
133
|
-
edgesCreated?: number;
|
|
134
|
-
durationMs?: number;
|
|
135
|
-
}
|
|
16
|
+
import type { AstSummary, CallGraphResult, CodeEntityGraphResult, DependencyGraph, DimensionDef, GuardAudit, IncrementalPlan, LocalPackageModule } from '#types/project-snapshot.js';
|
|
136
17
|
/** Guard rule 聚合条目 */
|
|
137
18
|
interface RuleMapEntry {
|
|
138
19
|
ruleId: string;
|
|
@@ -161,6 +42,14 @@ interface DimensionTask {
|
|
|
161
42
|
data: unknown;
|
|
162
43
|
}>;
|
|
163
44
|
}
|
|
45
|
+
/** Evidence starters 选项 */
|
|
46
|
+
interface EvidenceStarterOpts {
|
|
47
|
+
astData?: AstSummary | null;
|
|
48
|
+
guardAudit?: GuardAudit | null;
|
|
49
|
+
depGraphData?: DependencyGraph | null;
|
|
50
|
+
callGraphResult?: CallGraphResult | null;
|
|
51
|
+
panoramaResult?: Record<string, unknown> | null;
|
|
52
|
+
}
|
|
164
53
|
/** Target 信息 */
|
|
165
54
|
interface TargetInfo {
|
|
166
55
|
name: string;
|
|
@@ -168,13 +57,6 @@ interface TargetInfo {
|
|
|
168
57
|
inferredRole?: string;
|
|
169
58
|
fileCount?: number;
|
|
170
59
|
}
|
|
171
|
-
/** 增量计划 */
|
|
172
|
-
interface IncrementalPlan {
|
|
173
|
-
dimensions?: {
|
|
174
|
-
id: string;
|
|
175
|
-
status?: string;
|
|
176
|
-
}[];
|
|
177
|
-
}
|
|
178
60
|
/** 压缩后的协议 */
|
|
179
61
|
interface CompressedProtocol {
|
|
180
62
|
name: string;
|
|
@@ -275,6 +157,17 @@ interface MissionBriefing {
|
|
|
275
157
|
priority: string;
|
|
276
158
|
}>;
|
|
277
159
|
} | null;
|
|
160
|
+
mustCoverModules: {
|
|
161
|
+
totalLocalPackages: number;
|
|
162
|
+
modules: {
|
|
163
|
+
name: string;
|
|
164
|
+
packageName: string;
|
|
165
|
+
fileCount: number;
|
|
166
|
+
inferredRole?: string;
|
|
167
|
+
keyFiles: string[];
|
|
168
|
+
}[];
|
|
169
|
+
instruction: string;
|
|
170
|
+
} | null;
|
|
278
171
|
session: Record<string, unknown>;
|
|
279
172
|
meta?: {
|
|
280
173
|
responseSizeKB: number;
|
|
@@ -286,11 +179,11 @@ interface MissionBriefing {
|
|
|
286
179
|
/** buildMissionBriefing 参数 */
|
|
287
180
|
interface MissionBriefingParams {
|
|
288
181
|
projectMeta: Record<string, unknown>;
|
|
289
|
-
astData?:
|
|
290
|
-
codeEntityResult?:
|
|
182
|
+
astData?: AstSummary | null;
|
|
183
|
+
codeEntityResult?: CodeEntityGraphResult | null;
|
|
291
184
|
callGraphResult?: CallGraphResult | null;
|
|
292
|
-
depGraphData?:
|
|
293
|
-
guardAudit?:
|
|
185
|
+
depGraphData?: DependencyGraph | null;
|
|
186
|
+
guardAudit?: GuardAudit | null;
|
|
294
187
|
targets?: (string | TargetInfo)[];
|
|
295
188
|
activeDimensions: DimensionDef[];
|
|
296
189
|
session: {
|
|
@@ -300,7 +193,33 @@ interface MissionBriefingParams {
|
|
|
300
193
|
incrementalPlan?: IncrementalPlan | null;
|
|
301
194
|
languageStats?: Record<string, number> | null;
|
|
302
195
|
panoramaResult?: Record<string, unknown> | null;
|
|
196
|
+
localPackageModules?: LocalPackageModule[];
|
|
303
197
|
}
|
|
198
|
+
/**
|
|
199
|
+
* 从 Phase 1-4 数据中为维度提取证据启发
|
|
200
|
+
*
|
|
201
|
+
* 将原本的"原始 AST / Guard 数据"转化为维度关联的结构化引导,
|
|
202
|
+
* 让外部 Agent 更有方向性地开始分析:
|
|
203
|
+
* - 与维度相关的 AST 类/协议/模式
|
|
204
|
+
* - Guard 违规中与维度话题相关的发现
|
|
205
|
+
* - 依赖图中与维度相关的模块关系
|
|
206
|
+
*
|
|
207
|
+
* 设计对标: 内部 Agent 的 buildProducerPromptV2 提供结构化 findings 和 code evidence,
|
|
208
|
+
* 外部 Agent 的 evidenceStarters 从 Phase 1-4 数据中提供类似的结构化起点。
|
|
209
|
+
*
|
|
210
|
+
* @param dim 维度定义
|
|
211
|
+
* @param [opts.astData] analyzeProject() 结果
|
|
212
|
+
* @param [opts.guardAudit] GuardCheckEngine.auditFiles() 结果
|
|
213
|
+
* @param [opts.depGraphData] 依赖图
|
|
214
|
+
* @returns evidenceStarters 对象,为空则返回 undefined
|
|
215
|
+
*/
|
|
216
|
+
export declare function buildEvidenceStarters(dim: DimensionDef, { astData, guardAudit, depGraphData, callGraphResult, panoramaResult }: EvidenceStarterOpts): {
|
|
217
|
+
[k: string]: {
|
|
218
|
+
hint: string;
|
|
219
|
+
data: unknown;
|
|
220
|
+
strength: number;
|
|
221
|
+
};
|
|
222
|
+
} | undefined;
|
|
304
223
|
/**
|
|
305
224
|
* 构建 Mission Briefing
|
|
306
225
|
*
|
|
@@ -318,5 +237,6 @@ interface MissionBriefingParams {
|
|
|
318
237
|
export declare function buildMissionBriefing({ projectMeta, astData, codeEntityResult, callGraphResult, depGraphData, guardAudit, targets, activeDimensions, session, languageExtension, // §7.1: 语言扩展(反模式、Guard 规则、Agent 注意事项)
|
|
319
238
|
incrementalPlan, // §7.3: 增量 Bootstrap 评估结果
|
|
320
239
|
languageStats, // §7.4: 完整语言分布统计
|
|
321
|
-
panoramaResult,
|
|
240
|
+
panoramaResult, // §M1: Phase 1.8 全景数据
|
|
241
|
+
localPackageModules, }: MissionBriefingParams): MissionBriefing;
|
|
322
242
|
export {};
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
*
|
|
14
14
|
* @module bootstrap/MissionBriefingBuilder
|
|
15
15
|
*/
|
|
16
|
+
import { getDimensionSOP, PRE_SUBMIT_CHECKLIST, sopToCompactText, } from '#domain/dimension/DimensionSop.js';
|
|
16
17
|
import { getCursorDeliverySpec } from '#domain/knowledge/FieldSpec.js';
|
|
17
18
|
import { PROJECT_SNAPSHOT_STYLE_GUIDE } from '#domain/knowledge/StyleGuide.js';
|
|
18
19
|
import { TierScheduler } from './pipeline/tier-scheduler.js';
|
|
19
|
-
import { getDimensionSOP, PRE_SUBMIT_CHECKLIST, sopToCompactText } from './shared/dimension-sop.js';
|
|
20
20
|
import { EXAMPLE_TEMPLATES, SUBMISSION_SCHEMA } from './shared/dimension-text.js';
|
|
21
21
|
// ── 常量 ────────────────────────────────────────────────────
|
|
22
22
|
/** 响应体积硬上限 (bytes) */
|
|
@@ -45,7 +45,7 @@ function enrichDimensionTask(dim, tier) {
|
|
|
45
45
|
// SOP 结构化模式: steps + timeEstimate + commonMistakes
|
|
46
46
|
analysisGuide = {
|
|
47
47
|
goal: `分析项目的${dim.label}`,
|
|
48
|
-
focus: dim.guide,
|
|
48
|
+
focus: dim.guide || '',
|
|
49
49
|
steps: sop.steps,
|
|
50
50
|
timeEstimate: sop.timeEstimate || '1-5 min',
|
|
51
51
|
commonMistakes: sop.commonMistakes || [],
|
|
@@ -56,7 +56,7 @@ function enrichDimensionTask(dim, tier) {
|
|
|
56
56
|
// 保持 analysisGuide 为对象格式,确保 SOP 覆盖率
|
|
57
57
|
analysisGuide = {
|
|
58
58
|
goal: `分析项目的${dim.label}`,
|
|
59
|
-
focus: dim.guide,
|
|
59
|
+
focus: dim.guide || '',
|
|
60
60
|
steps: [
|
|
61
61
|
{
|
|
62
62
|
phase: '1. 全局扫描',
|
|
@@ -89,7 +89,9 @@ function enrichDimensionTask(dim, tier) {
|
|
|
89
89
|
timeEstimate: '1-5 min',
|
|
90
90
|
commonMistakes: [
|
|
91
91
|
'不要只扫描 1 个文件就提交 — 至少读 5+ 个文件验证模式一致性',
|
|
92
|
-
'content 中必须有 (来源: FileName.ext:行号)
|
|
92
|
+
'content 中必须有 (来源: Full/Path/FileName.ext:行号) 标注具体出处,必须是从项目根开始的完整相对路径',
|
|
93
|
+
'【跨维度去重】每条候选必须属于当前维度的独有视角 — 禁止将同一知识点换个角度重复提交到多个维度来充数,宁可少提交也不要重复',
|
|
94
|
+
'【本地子包覆盖】如果项目有本地子包/模块(如 Packages/ 下的包),必须同时分析其内部实现,不得只看主项目对其的调用',
|
|
93
95
|
],
|
|
94
96
|
};
|
|
95
97
|
}
|
|
@@ -102,16 +104,21 @@ function enrichDimensionTask(dim, tier) {
|
|
|
102
104
|
.filter((l) => l.trim())
|
|
103
105
|
.slice(0, 12)
|
|
104
106
|
.join('\n'),
|
|
105
|
-
contentQuality: 'content.markdown 必须 ≥200 字符,包含: (1) ## 标题 (2) 正文说明 (3) 至少一个 ```代码块``` (4) 来源标注「(来源: FileName.ext:行号)
|
|
107
|
+
contentQuality: 'content.markdown 必须 ≥200 字符,包含: (1) ## 标题 (2) 正文说明 (3) 至少一个 ```代码块``` (4) 来源标注「(来源: Full/Relative/Path/FileName.ext:行号)」。\n【最高优先级 — 源码位置】每个候选必须包含完整相对路径(从项目根目录开始)+ 行号。禁止只写文件名(如 NetworkClient.swift:42),必须写完整路径(如 Packages/AOXNetworkKit/Sources/AOXNetworkKit/Client/NetworkClient.swift:42)。reasoning.sources 中也必须是完整相对路径。\n【模块归属】每个候选必须标注所属模块(如「所属模块: AOXNetworkKit」)。\n短于 200 字符的提交会被拒绝。\n【禁止】标题和正文中不得出现 "Agent" 字样 — 所有候选必须以项目规范/开发规范的视角撰写,描述的是项目规则而非 AI Agent 指南。',
|
|
108
|
+
crossDimensionDedup: '【跨维度去重 — 系统强制拒绝】每条候选必须属于且仅属于当前维度的视角。禁止将同一知识点换个角度/换个说法重复提交到多个维度。' +
|
|
109
|
+
'例如: BaseViewController 的继承规则只应出现在 code-pattern(设计模式)中,不应同时出现在 architecture(分层架构)和 code-standard(命名规范)中。' +
|
|
110
|
+
'如果某个发现与多个维度相关,只在最核心的维度提交,其他维度用不同的独立知识点填充。' +
|
|
111
|
+
'宁可少提交也不要重复充数 — 与前序维度标题相同的候选会被系统自动拒绝(硬去重)。',
|
|
106
112
|
cursorFields: getCursorDeliverySpec(),
|
|
107
113
|
dimensionCompleteGuide: '调用 dimension_complete 时必须传递: referencedFiles=[本维度分析过的全部文件路径], keyFindings=[3-5条关键发现摘要], analysisText=详细分析报告(≥500字符,含##标题+列表+代码块)',
|
|
108
114
|
preSubmitChecklist: PRE_SUBMIT_CHECKLIST,
|
|
109
115
|
};
|
|
110
116
|
// ── skillMeta ──
|
|
117
|
+
const sm = dim.skillMeta;
|
|
111
118
|
const skillMeta = dim.skillWorthy
|
|
112
119
|
? {
|
|
113
|
-
name:
|
|
114
|
-
description:
|
|
120
|
+
name: sm?.name || `project-${dim.id}`,
|
|
121
|
+
description: sm?.description || `${dim.label} skill (auto-generated)`,
|
|
115
122
|
format: 'Markdown 正文,需包含 # 标题、列表、代码块等结构化内容,≥100 字符',
|
|
116
123
|
}
|
|
117
124
|
: undefined;
|
|
@@ -145,7 +152,7 @@ function enrichDimensionTask(dim, tier) {
|
|
|
145
152
|
* @param [opts.depGraphData] 依赖图
|
|
146
153
|
* @returns evidenceStarters 对象,为空则返回 undefined
|
|
147
154
|
*/
|
|
148
|
-
function buildEvidenceStarters(dim, { astData, guardAudit, depGraphData }) {
|
|
155
|
+
export function buildEvidenceStarters(dim, { astData, guardAudit, depGraphData, callGraphResult, panoramaResult }) {
|
|
149
156
|
const starters = {};
|
|
150
157
|
const dimId = dim.id;
|
|
151
158
|
const dimLabel = (dim.label || '').toLowerCase();
|
|
@@ -299,7 +306,7 @@ function buildEvidenceStarters(dim, { astData, guardAudit, depGraphData }) {
|
|
|
299
306
|
if (dimId.split('-').some((word) => word.length > 3 && ruleText.includes(word))) {
|
|
300
307
|
dimRelatedViolations.push({
|
|
301
308
|
file: fileResult.filePath,
|
|
302
|
-
rule: v.ruleId,
|
|
309
|
+
rule: v.ruleId || '',
|
|
303
310
|
message: (v.message || '').substring(0, 100),
|
|
304
311
|
});
|
|
305
312
|
}
|
|
@@ -311,6 +318,24 @@ function buildEvidenceStarters(dim, { astData, guardAudit, depGraphData }) {
|
|
|
311
318
|
data: dimRelatedViolations.slice(0, 5),
|
|
312
319
|
};
|
|
313
320
|
}
|
|
321
|
+
// §2.5: 跨文件违规单独高亮 — architecture / best-practice 维度重点关注
|
|
322
|
+
const crossFileViolations = guardAudit.crossFileViolations || [];
|
|
323
|
+
if (crossFileViolations.length > 0 &&
|
|
324
|
+
(dimId === 'architecture' ||
|
|
325
|
+
dimId === 'best-practice' ||
|
|
326
|
+
dimId === 'code-standard' ||
|
|
327
|
+
dimKeywords.includes('架构') ||
|
|
328
|
+
dimKeywords.includes('层级') ||
|
|
329
|
+
dimKeywords.includes('依赖方向'))) {
|
|
330
|
+
starters.crossFileViolations = {
|
|
331
|
+
hint: `Guard 检测到 ${crossFileViolations.length} 条跨文件违规(如层级穿透、循环引用) — 这是架构分析的关键信号`,
|
|
332
|
+
data: crossFileViolations.slice(0, 5).map((v) => ({
|
|
333
|
+
rule: v.ruleId,
|
|
334
|
+
message: (v.message || '').substring(0, 120),
|
|
335
|
+
files: v.locations?.slice(0, 2).map((l) => l.filePath) || [],
|
|
336
|
+
})),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
314
339
|
}
|
|
315
340
|
// §3: 依赖图关联 (扩大到所有架构/模块相关维度)
|
|
316
341
|
if (depGraphData?.nodes) {
|
|
@@ -403,7 +428,120 @@ function buildEvidenceStarters(dim, { astData, guardAudit, depGraphData }) {
|
|
|
403
428
|
};
|
|
404
429
|
}
|
|
405
430
|
}
|
|
406
|
-
|
|
431
|
+
// §6: 调用图证据 — 为 best-practice / event-and-data-flow / code-pattern 提供热点方法
|
|
432
|
+
if (callGraphResult) {
|
|
433
|
+
const callEdges = callGraphResult.edgesCreated;
|
|
434
|
+
const methodEntities = callGraphResult.entitiesUpserted;
|
|
435
|
+
if (callEdges &&
|
|
436
|
+
callEdges > 0 &&
|
|
437
|
+
(dimId === 'best-practice' ||
|
|
438
|
+
dimId === 'event-and-data-flow' ||
|
|
439
|
+
dimId === 'code-pattern' ||
|
|
440
|
+
dimKeywords.includes('并发') ||
|
|
441
|
+
dimKeywords.includes('concurrency') ||
|
|
442
|
+
dimKeywords.includes('事件') ||
|
|
443
|
+
dimKeywords.includes('flow'))) {
|
|
444
|
+
starters.callGraphSummary = {
|
|
445
|
+
hint: `调用图包含 ${methodEntities || 0} 个方法实体、${callEdges} 条调用边 — 关注高扇入/扇出方法和异步调用链`,
|
|
446
|
+
data: {
|
|
447
|
+
methodEntities: methodEntities || 0,
|
|
448
|
+
callEdges,
|
|
449
|
+
durationMs: callGraphResult.durationMs || 0,
|
|
450
|
+
analysisHint: dimId === 'best-practice'
|
|
451
|
+
? '关注扇入最高的方法(核心抽象)和扇出最高的方法(协调者),以及 async/await 调用链'
|
|
452
|
+
: dimId === 'event-and-data-flow'
|
|
453
|
+
? '关注数据流边和事件传播路径,特别是跨模块的观察者和回调链'
|
|
454
|
+
: '关注方法调用模式中的设计模式(如 Template Method、Chain of Responsibility)',
|
|
455
|
+
},
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
// §7: Panorama 热点模块 — 为 architecture / project-profile 提供耦合分析起点
|
|
460
|
+
if (panoramaResult) {
|
|
461
|
+
const panoramaModules = panoramaResult.modules;
|
|
462
|
+
const panoramaCycles = panoramaResult.cycles ?? [];
|
|
463
|
+
if (panoramaModules instanceof Map &&
|
|
464
|
+
(dimId === 'architecture' ||
|
|
465
|
+
dimId === 'project-profile' ||
|
|
466
|
+
dimId === 'best-practice' ||
|
|
467
|
+
dimKeywords.includes('架构') ||
|
|
468
|
+
dimKeywords.includes('模块') ||
|
|
469
|
+
dimKeywords.includes('耦合'))) {
|
|
470
|
+
// 提取高耦合模块(fanIn+fanOut 排序)
|
|
471
|
+
const hotspots = [];
|
|
472
|
+
for (const [, mod] of panoramaModules) {
|
|
473
|
+
if (mod.fanIn >= 5 || mod.fanOut >= 5) {
|
|
474
|
+
hotspots.push({ module: mod.name, fanIn: mod.fanIn, fanOut: mod.fanOut });
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
hotspots.sort((a, b) => b.fanIn + b.fanOut - (a.fanIn + a.fanOut));
|
|
478
|
+
if (hotspots.length > 0) {
|
|
479
|
+
starters.couplingHotspots = {
|
|
480
|
+
hint: `全景分析发现 ${hotspots.length} 个高耦合模块 — 优先分析其架构边界和依赖方向`,
|
|
481
|
+
data: hotspots
|
|
482
|
+
.slice(0, 8)
|
|
483
|
+
.map((h) => `${h.module} (fanIn=${h.fanIn}, fanOut=${h.fanOut})`),
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// 循环依赖 → architecture / best-practice
|
|
488
|
+
if (panoramaCycles.length > 0 &&
|
|
489
|
+
(dimId === 'architecture' ||
|
|
490
|
+
dimId === 'best-practice' ||
|
|
491
|
+
dimKeywords.includes('架构') ||
|
|
492
|
+
dimKeywords.includes('依赖'))) {
|
|
493
|
+
starters.cyclicDependencies = {
|
|
494
|
+
hint: `全景分析检测到 ${panoramaCycles.length} 组循环依赖 — 需要在分析中识别并记录`,
|
|
495
|
+
data: panoramaCycles.slice(0, 5).map((c) => ({
|
|
496
|
+
cycle: c.cycle.join(' → '),
|
|
497
|
+
severity: c.severity,
|
|
498
|
+
})),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
if (Object.keys(starters).length === 0) {
|
|
503
|
+
return undefined;
|
|
504
|
+
}
|
|
505
|
+
// §8: 信号强度评估 — 根据数据显著性为每个 starter 附加 strength (0-100)
|
|
506
|
+
const withStrength = {};
|
|
507
|
+
for (const [key, value] of Object.entries(starters)) {
|
|
508
|
+
let strength = 50; // 默认中等
|
|
509
|
+
const dataArr = Array.isArray(value.data) ? value.data : null;
|
|
510
|
+
const dataCount = dataArr ? dataArr.length : 0;
|
|
511
|
+
// 统计类 starters — 数据量越大信号越强
|
|
512
|
+
if (key === 'namingPrefixSuffix' || key === 'patternStats' || key === 'inheritanceChains') {
|
|
513
|
+
strength = Math.min(90, 40 + dataCount * 10);
|
|
514
|
+
}
|
|
515
|
+
else if (key === 'guardViolations') {
|
|
516
|
+
// Guard 违规 — 越多越值得关注
|
|
517
|
+
const violations = value.data?.totalViolations || dataCount;
|
|
518
|
+
strength = Math.min(95, 50 + violations * 5);
|
|
519
|
+
}
|
|
520
|
+
else if (key === 'crossFileViolations') {
|
|
521
|
+
// 跨文件违规 — 高优先级信号(涉及架构边界)
|
|
522
|
+
strength = Math.min(95, 75 + dataCount * 8);
|
|
523
|
+
}
|
|
524
|
+
else if (key === 'callGraphSummary') {
|
|
525
|
+
const edges = value.data?.callEdges ?? 0;
|
|
526
|
+
strength = edges > 50 ? 85 : edges > 10 ? 70 : 55;
|
|
527
|
+
}
|
|
528
|
+
else if (key === 'couplingHotspots') {
|
|
529
|
+
strength = Math.min(90, 60 + dataCount * 8);
|
|
530
|
+
}
|
|
531
|
+
else if (key === 'cyclicDependencies') {
|
|
532
|
+
strength = Math.min(95, 70 + dataCount * 10); // 循环依赖是高优先级信号
|
|
533
|
+
}
|
|
534
|
+
else if (key === 'delegatePatterns' || key === 'observerPatterns') {
|
|
535
|
+
strength = Math.min(85, 45 + dataCount * 8);
|
|
536
|
+
}
|
|
537
|
+
else if (key === 'depGraph') {
|
|
538
|
+
strength = 60;
|
|
539
|
+
}
|
|
540
|
+
withStrength[key] = { ...value, strength };
|
|
541
|
+
}
|
|
542
|
+
// 按 strength 降序排列(通过 entries+sort 重构对象键顺序)
|
|
543
|
+
const sorted = Object.fromEntries(Object.entries(withStrength).sort(([, a], [, b]) => b.strength - a.strength));
|
|
544
|
+
return sorted;
|
|
407
545
|
}
|
|
408
546
|
// ── AST 压缩 ────────────────────────────────────────────────
|
|
409
547
|
/**
|
|
@@ -484,7 +622,7 @@ function compressAstForBriefing(astProjectSummary, fileCount) {
|
|
|
484
622
|
}));
|
|
485
623
|
const compressedCategories = categories.slice(0, topN).map((cat) => ({
|
|
486
624
|
baseClass: cat.baseClass || cat.extendedClass,
|
|
487
|
-
name: cat.name,
|
|
625
|
+
name: cat.name || '',
|
|
488
626
|
file: cat.file || cat.relativePath || null,
|
|
489
627
|
methods: (cat.methods || [])
|
|
490
628
|
.map((m) => (typeof m === 'string' ? m : m.name))
|
|
@@ -570,12 +708,13 @@ function summarizeGuardFindings(guardAudit) {
|
|
|
570
708
|
const ruleMap = {};
|
|
571
709
|
// helper: 将单个 violation 累加到 ruleMap
|
|
572
710
|
const addViolation = (v, examplePrefix) => {
|
|
573
|
-
|
|
574
|
-
|
|
711
|
+
const ruleId = v.ruleId || 'unknown';
|
|
712
|
+
if (!ruleMap[ruleId]) {
|
|
713
|
+
ruleMap[ruleId] = { ruleId, count: 0, example: null };
|
|
575
714
|
}
|
|
576
|
-
ruleMap[
|
|
577
|
-
if (!ruleMap[
|
|
578
|
-
ruleMap[
|
|
715
|
+
ruleMap[ruleId].count++;
|
|
716
|
+
if (!ruleMap[ruleId].example) {
|
|
717
|
+
ruleMap[ruleId].example = `${examplePrefix} — ${v.message}`;
|
|
579
718
|
}
|
|
580
719
|
};
|
|
581
720
|
// 1) Per-file violations
|
|
@@ -596,11 +735,19 @@ function summarizeGuardFindings(guardAudit) {
|
|
|
596
735
|
.slice(0, 5);
|
|
597
736
|
const totalErrors = guardAudit.summary?.totalErrors || 0;
|
|
598
737
|
const totalViolations = guardAudit.summary?.totalViolations || 0;
|
|
738
|
+
// §V2: 单独高亮跨文件违规 — 这类违规通常涉及架构层级或模块边界问题
|
|
739
|
+
const crossFileIssues = (guardAudit.crossFileViolations || []).map((v) => ({
|
|
740
|
+
ruleId: v.ruleId,
|
|
741
|
+
message: v.message,
|
|
742
|
+
locations: v.locations?.slice(0, 3),
|
|
743
|
+
severity: v.severity || 'warning',
|
|
744
|
+
}));
|
|
599
745
|
return {
|
|
600
746
|
totalViolations,
|
|
601
747
|
errors: totalErrors,
|
|
602
748
|
warnings: totalViolations - totalErrors,
|
|
603
749
|
topViolations,
|
|
750
|
+
...(crossFileIssues.length > 0 ? { crossFileIssues } : {}),
|
|
604
751
|
};
|
|
605
752
|
}
|
|
606
753
|
// ── 执行计划构建 ─────────────────────────────────────────────
|
|
@@ -654,6 +801,37 @@ function buildExecutionPlan(activeDimensions) {
|
|
|
654
801
|
* 从 PanoramaResult 提取 layers / couplingHotspots / cycles / gaps
|
|
655
802
|
* 用于注入 MissionBriefing,使外部 Agent 获得项目全景视野
|
|
656
803
|
*/
|
|
804
|
+
// ── 本地子包/模块 — mustCoverModules ────────────────────────
|
|
805
|
+
/**
|
|
806
|
+
* 构建 mustCoverModules 段落 — 标记来自本地子包的基础设施模块
|
|
807
|
+
*
|
|
808
|
+
* 语言无关:只依赖 Discoverer 返回的 target metadata 中的 isLocalPackage 标记。
|
|
809
|
+
* 无论 SPM (Swift)、monorepo (TS)、Gradle subproject (Java/Kotlin),
|
|
810
|
+
* 只要某 target 来自非主 projectRoot 的子目录,就被视为本地子包。
|
|
811
|
+
*
|
|
812
|
+
* @param localPackageModules Phase 1 收集的子包信息
|
|
813
|
+
* @returns mustCoverModules 段落
|
|
814
|
+
*/
|
|
815
|
+
function buildMustCoverModules(localPackageModules) {
|
|
816
|
+
if (!localPackageModules || localPackageModules.length === 0) {
|
|
817
|
+
return null;
|
|
818
|
+
}
|
|
819
|
+
return {
|
|
820
|
+
totalLocalPackages: localPackageModules.length,
|
|
821
|
+
modules: localPackageModules.map((m) => ({
|
|
822
|
+
name: m.name,
|
|
823
|
+
packageName: m.packageName,
|
|
824
|
+
fileCount: m.fileCount,
|
|
825
|
+
inferredRole: m.inferredRole,
|
|
826
|
+
keyFiles: m.keyFiles || [],
|
|
827
|
+
})),
|
|
828
|
+
instruction: '【强制覆盖】以下本地子包/模块是项目的基础设施层,包含核心抽象和共享服务。' +
|
|
829
|
+
'每个维度分析时必须同时覆盖主项目代码和这些子包代码。' +
|
|
830
|
+
'提交的知识候选中必须包含子包源码的完整相对路径和行号(如 Packages/AOXNetworkKit/Sources/.../NetworkClient.swift:42),' +
|
|
831
|
+
'不得仅引用主项目中对子包的调用,而忽略子包内部的实现细节。' +
|
|
832
|
+
'对于 architecture、code-pattern、best-practice 维度,至少要有 1 条候选直接引用子包的核心实现文件。',
|
|
833
|
+
};
|
|
834
|
+
}
|
|
657
835
|
function summarizePanorama(panoramaResult) {
|
|
658
836
|
if (!panoramaResult) {
|
|
659
837
|
return null;
|
|
@@ -707,6 +885,7 @@ export function buildMissionBriefing({ projectMeta, astData, codeEntityResult, c
|
|
|
707
885
|
incrementalPlan, // §7.3: 增量 Bootstrap 评估结果
|
|
708
886
|
languageStats, // §7.4: 完整语言分布统计
|
|
709
887
|
panoramaResult, // §M1: Phase 1.8 全景数据
|
|
888
|
+
localPackageModules, // 本地子包模块信息
|
|
710
889
|
}) {
|
|
711
890
|
const scheduler = new TierScheduler();
|
|
712
891
|
// ── 构建维度任务列表 (v2: 附带 evidenceStarters) ──
|
|
@@ -723,7 +902,13 @@ panoramaResult, // §M1: Phase 1.8 全景数据
|
|
|
723
902
|
}
|
|
724
903
|
}
|
|
725
904
|
// v2: 从 Phase 1-4 数据中提取维度相关的证据启发
|
|
726
|
-
const evidenceStarters = buildEvidenceStarters(dim, {
|
|
905
|
+
const evidenceStarters = buildEvidenceStarters(dim, {
|
|
906
|
+
astData,
|
|
907
|
+
guardAudit,
|
|
908
|
+
depGraphData,
|
|
909
|
+
callGraphResult,
|
|
910
|
+
panoramaResult,
|
|
911
|
+
});
|
|
727
912
|
if (evidenceStarters) {
|
|
728
913
|
task.evidenceStarters = evidenceStarters;
|
|
729
914
|
}
|
|
@@ -768,6 +953,8 @@ panoramaResult, // §M1: Phase 1.8 全景数据
|
|
|
768
953
|
languageStats: languageStats || null,
|
|
769
954
|
executionPlan: buildExecutionPlan(activeDimensions),
|
|
770
955
|
panorama: summarizePanorama(panoramaResult ?? null),
|
|
956
|
+
// 本地子包/模块 — 必须覆盖的基础设施模块
|
|
957
|
+
mustCoverModules: buildMustCoverModules(localPackageModules),
|
|
771
958
|
session: session.toJSON(),
|
|
772
959
|
};
|
|
773
960
|
// ── 体积检测 + 渐进式压缩 ──
|