autosnippet 3.2.17 → 3.2.20
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 +73 -104
- package/dashboard/dist/assets/{index-CKMy5LY6.js → index-DdvZE4Yd.js} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/dist/bin/cli.js +88 -49
- package/dist/lib/agent/AgentEventBus.js +3 -3
- package/dist/lib/agent/AgentFactory.d.ts +3 -3
- package/dist/lib/agent/AgentFactory.js +4 -4
- package/dist/lib/agent/AgentMessage.d.ts +8 -8
- package/dist/lib/agent/AgentMessage.js +8 -8
- package/dist/lib/agent/AgentRuntime.js +2 -2
- package/dist/lib/agent/AgentState.js +4 -4
- package/dist/lib/agent/ConversationStore.d.ts +1 -1
- package/dist/lib/agent/ConversationStore.js +1 -1
- package/dist/lib/agent/PipelineStrategy.js +1 -1
- package/dist/lib/agent/context/ContextWindow.d.ts +2 -2
- package/dist/lib/agent/context/ContextWindow.js +7 -7
- package/dist/lib/agent/context/ExplorationTracker.js +9 -9
- package/dist/lib/agent/context/exploration/PlanTracker.js +2 -2
- package/dist/lib/agent/context/exploration/SignalDetector.d.ts +1 -1
- package/dist/lib/agent/context/exploration/SignalDetector.js +1 -1
- package/dist/lib/agent/core/LoopContext.d.ts +21 -21
- package/dist/lib/agent/core/LoopContext.js +21 -21
- package/dist/lib/agent/core/SystemPromptBuilder.js +4 -4
- package/dist/lib/agent/domain/EvidenceCollector.js +5 -5
- package/dist/lib/agent/memory/ActiveContext.js +1 -1
- package/dist/lib/agent/memory/MemoryRetriever.js +1 -1
- package/dist/lib/agent/memory/MemoryStore.js +2 -2
- package/dist/lib/agent/memory/SessionStore.js +3 -3
- package/dist/lib/agent/policies.d.ts +1 -1
- package/dist/lib/agent/policies.js +1 -1
- package/dist/lib/agent/strategies.d.ts +1 -1
- package/dist/lib/agent/strategies.js +4 -4
- package/dist/lib/agent/tools/_shared.d.ts +1 -1
- package/dist/lib/agent/tools/_shared.js +1 -1
- package/dist/lib/agent/tools/infrastructure.js +2 -2
- package/dist/lib/cli/SetupService.d.ts +25 -25
- package/dist/lib/cli/SetupService.js +28 -15
- package/dist/lib/cli/deploy/FileDeployer.d.ts +9 -2
- package/dist/lib/cli/deploy/FileDeployer.js +139 -46
- package/dist/lib/cli/deploy/FileManifest.d.ts +23 -39
- package/dist/lib/cli/deploy/FileManifest.js +22 -27
- package/dist/lib/core/AstAnalyzer.d.ts +2 -2
- package/dist/lib/core/AstAnalyzer.js +2 -2
- package/dist/lib/core/analysis/CallEdgeResolver.d.ts +7 -7
- package/dist/lib/core/analysis/CallEdgeResolver.js +9 -9
- package/dist/lib/core/analysis/CallGraphAnalyzer.d.ts +4 -4
- package/dist/lib/core/analysis/CallGraphAnalyzer.js +2 -2
- package/dist/lib/core/analysis/ImportPathResolver.d.ts +0 -2
- package/dist/lib/core/analysis/ImportPathResolver.js +2 -4
- package/dist/lib/core/ast/ProjectGraph.js +7 -7
- package/dist/lib/core/capability/CapabilityProbe.js +6 -14
- package/dist/lib/domain/knowledge/UnifiedValidator.js +2 -2
- package/dist/lib/domain/knowledge/values/Constraints.js +4 -4
- package/dist/lib/domain/knowledge/values/Content.js +6 -6
- package/dist/lib/domain/knowledge/values/Quality.js +5 -5
- package/dist/lib/domain/knowledge/values/Reasoning.js +5 -5
- package/dist/lib/domain/knowledge/values/Relations.js +1 -1
- package/dist/lib/domain/knowledge/values/Stats.js +6 -6
- package/dist/lib/domain/task/TaskIdGenerator.d.ts +4 -4
- package/dist/lib/domain/task/TaskIdGenerator.js +2 -2
- package/dist/lib/external/lark/LarkTransport.js +4 -4
- package/dist/lib/external/mcp/McpServer.d.ts +3 -7
- package/dist/lib/external/mcp/McpServer.js +9 -13
- package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +5 -5
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +4 -3
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.d.ts +3 -3
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.js +3 -3
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/IncrementalBootstrap.d.ts +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/IncrementalBootstrap.js +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.js +3 -3
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +27 -14
- package/dist/lib/external/mcp/handlers/bootstrap-external.js +6 -0
- package/dist/lib/external/mcp/handlers/dimension-complete-external.js +55 -1
- package/dist/lib/external/mcp/handlers/skill.js +9 -31
- package/dist/lib/external/mcp/handlers/system.js +2 -2
- package/dist/lib/external/mcp/handlers/task.js +16 -1
- package/dist/lib/external/mcp/tools.d.ts +12 -10
- package/dist/lib/external/mcp/tools.js +97 -69
- package/dist/lib/http/HttpServer.js +15 -2
- package/dist/lib/http/utils/routeHelpers.d.ts +1 -1
- package/dist/lib/http/utils/routeHelpers.js +1 -1
- package/dist/lib/http/utils/sse-sessions.d.ts +1 -1
- package/dist/lib/http/utils/sse-sessions.js +1 -1
- package/dist/lib/infrastructure/cache/CacheService.js +1 -1
- package/dist/lib/infrastructure/vector/AsyncPersistence.js +8 -8
- package/dist/lib/infrastructure/vector/BatchEmbedder.d.ts +1 -1
- package/dist/lib/infrastructure/vector/BatchEmbedder.js +2 -2
- package/dist/lib/infrastructure/vector/HnswIndex.d.ts +4 -4
- package/dist/lib/infrastructure/vector/HnswIndex.js +5 -5
- package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +8 -8
- package/dist/lib/infrastructure/vector/ScalarQuantizer.d.ts +1 -1
- package/dist/lib/infrastructure/vector/ScalarQuantizer.js +4 -4
- package/dist/lib/infrastructure/vector/VectorStore.d.ts +1 -1
- package/dist/lib/infrastructure/vector/VectorStore.js +1 -1
- package/dist/lib/injection/ServiceContainer.d.ts +1 -1
- package/dist/lib/injection/ServiceContainer.js +1 -1
- package/dist/lib/platform/NativeUi.d.ts +1 -1
- package/dist/lib/platform/NativeUi.js +1 -1
- package/dist/lib/platform/ios/spm/DependencyGraph.d.ts +1 -1
- package/dist/lib/platform/ios/spm/DependencyGraph.js +1 -1
- package/dist/lib/platform/ios/spm/PolicyEngine.d.ts +1 -1
- package/dist/lib/platform/ios/spm/PolicyEngine.js +1 -1
- package/dist/lib/platform/ios/spm/SpmDiscoverer.js +1 -1
- package/dist/lib/platform/ios/spm/SpmHelper.js +3 -3
- package/dist/lib/platform/ios/xcode/SaveEventFilter.js +2 -2
- package/dist/lib/platform/ios/xcode/XcodeIntegration.js +1 -1
- package/dist/lib/repository/base/BaseRepository.js +1 -1
- package/dist/lib/repository/task/TaskRepository.impl.d.ts +2 -2
- package/dist/lib/repository/task/TaskRepository.impl.js +1 -1
- package/dist/lib/repository/token/TokenUsageStore.js +1 -1
- package/dist/lib/service/automation/ActionPipeline.d.ts +1 -1
- package/dist/lib/service/automation/ActionPipeline.js +1 -1
- package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +2 -2
- package/dist/lib/service/bootstrap/BootstrapTaskManager.d.ts +1 -1
- package/dist/lib/service/bootstrap/BootstrapTaskManager.js +2 -2
- package/dist/lib/service/bootstrap/DimensionCopyRegistry.d.ts +2 -2
- package/dist/lib/service/bootstrap/DimensionCopyRegistry.js +2 -2
- package/dist/lib/service/delivery/AgentInstructionsGenerator.d.ts +6 -15
- package/dist/lib/service/delivery/AgentInstructionsGenerator.js +53 -189
- package/dist/lib/service/delivery/CursorDeliveryPipeline.d.ts +6 -16
- package/dist/lib/service/delivery/CursorDeliveryPipeline.js +14 -19
- package/dist/lib/service/delivery/KnowledgeCompressor.d.ts +1 -1
- package/dist/lib/service/delivery/KnowledgeCompressor.js +1 -1
- package/dist/lib/service/delivery/RulesGenerator.d.ts +10 -3
- package/dist/lib/service/delivery/RulesGenerator.js +43 -3
- package/dist/lib/service/delivery/SkillsSyncer.d.ts +21 -7
- package/dist/lib/service/delivery/SkillsSyncer.js +46 -10
- package/dist/lib/service/delivery/TopicClassifier.d.ts +3 -6
- package/dist/lib/service/delivery/TopicClassifier.js +0 -3
- package/dist/lib/service/guard/ExclusionManager.d.ts +1 -1
- package/dist/lib/service/guard/ExclusionManager.js +1 -1
- package/dist/lib/service/guard/GuardCheckEngine.d.ts +3 -3
- package/dist/lib/service/guard/GuardCheckEngine.js +5 -5
- package/dist/lib/service/guard/GuardCrossFileChecks.d.ts +1 -1
- package/dist/lib/service/guard/GuardFeedbackLoop.d.ts +3 -3
- package/dist/lib/service/guard/GuardFeedbackLoop.js +3 -3
- package/dist/lib/service/guard/GuardPatternUtils.js +1 -1
- package/dist/lib/service/guard/GuardService.d.ts +1 -15
- package/dist/lib/service/guard/GuardService.js +0 -1
- package/dist/lib/service/guard/RuleLearner.d.ts +1 -1
- package/dist/lib/service/guard/RuleLearner.js +1 -1
- package/dist/lib/service/knowledge/CodeEntityGraph.d.ts +3 -3
- package/dist/lib/service/knowledge/CodeEntityGraph.js +3 -3
- package/dist/lib/service/knowledge/KnowledgeService.d.ts +0 -1
- package/dist/lib/service/knowledge/KnowledgeService.js +0 -1
- package/dist/lib/service/module/ModuleService.d.ts +1 -1
- package/dist/lib/service/module/ModuleService.js +2 -2
- package/dist/lib/service/search/HybridRetriever.d.ts +2 -2
- package/dist/lib/service/search/HybridRetriever.js +2 -2
- package/dist/lib/service/search/SearchEngine.d.ts +1 -3
- package/dist/lib/service/search/SearchEngine.js +1 -3
- package/dist/lib/service/search/contextBoost.d.ts +1 -1
- package/dist/lib/service/skills/EventAggregator.js +2 -2
- package/dist/lib/service/skills/SignalCollector.js +1 -1
- package/dist/lib/service/snippet/codecs/VSCodeCodec.js +1 -1
- package/dist/lib/service/task/TaskGraphService.d.ts +0 -3
- package/dist/lib/service/task/TaskGraphService.js +0 -3
- package/dist/lib/service/task/TaskKnowledgeBridge.d.ts +8 -27
- package/dist/lib/service/task/TaskKnowledgeBridge.js +0 -8
- package/dist/lib/service/task/TaskReadyEngine.d.ts +1 -2
- package/dist/lib/service/task/TaskReadyEngine.js +0 -1
- package/dist/lib/service/wiki/WikiRenderers.js +0 -1
- package/dist/lib/service/wiki/WikiUtils.js +2 -7
- package/dist/lib/shared/PathGuard.js +6 -6
- package/dist/lib/shared/schemas/mcp-tools.js +84 -43
- package/dist/scripts/install-vscode-copilot.js +14 -4
- package/package.json +1 -1
- package/skills/autosnippet-create/SKILL.md +131 -131
- package/skills/autosnippet-devdocs/SKILL.md +1 -2
- package/skills/autosnippet-guard/SKILL.md +20 -89
- package/skills/autosnippet-recipes/SKILL.md +35 -117
- package/skills/autosnippet-structure/SKILL.md +23 -55
- package/templates/cursor-rules/autosnippet-skills.mdc +17 -33
- package/templates/instructions/agent-static.md +24 -0
- package/templates/instructions/conventions.md +42 -0
- package/skills/autosnippet-analysis/SKILL.md +0 -169
- package/skills/autosnippet-candidates/SKILL.md +0 -367
- package/skills/autosnippet-coldstart/SKILL.md +0 -988
- package/skills/autosnippet-concepts/SKILL.md +0 -630
- package/skills/autosnippet-intent/SKILL.md +0 -55
- package/skills/autosnippet-lifecycle/SKILL.md +0 -100
- package/templates/copilot-instructions.md +0 -66
- package/templates/cursor-rules/autosnippet-conventions.mdc +0 -172
- package/templates/cursor-rules/autosnippet-workflow.mdc +0 -76
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* Handler 实现 → handlers/*.js
|
|
19
19
|
* 整合路由 → handlers/consolidated.js
|
|
20
20
|
*/
|
|
21
|
-
import {
|
|
21
|
+
import { McpServer as SdkMcpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
22
22
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
23
23
|
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
24
24
|
import { CapabilityProbe } from '#core/capability/CapabilityProbe.js';
|
|
@@ -48,12 +48,12 @@ export class McpServer {
|
|
|
48
48
|
_session;
|
|
49
49
|
_startedAt;
|
|
50
50
|
bootstrap;
|
|
51
|
-
|
|
51
|
+
sdkServer;
|
|
52
52
|
constructor(options = {}) {
|
|
53
53
|
this.logger = Logger.getInstance();
|
|
54
54
|
this.container = options.container || null;
|
|
55
55
|
this.bootstrap = options.bootstrap || null;
|
|
56
|
-
this.
|
|
56
|
+
this.sdkServer = null;
|
|
57
57
|
this._startedAt = Date.now();
|
|
58
58
|
this._autoApproveMarked = false;
|
|
59
59
|
this._capabilityProbe = null;
|
|
@@ -115,7 +115,7 @@ export class McpServer {
|
|
|
115
115
|
registerGatewayActions(gateway, this.container);
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
|
-
this.
|
|
118
|
+
this.sdkServer = new SdkMcpServer({ name: 'autosnippet-v3', version: '3.0.0' }, { capabilities: { tools: {} } });
|
|
119
119
|
this._registerHandlers();
|
|
120
120
|
return this;
|
|
121
121
|
}
|
|
@@ -125,14 +125,14 @@ export class McpServer {
|
|
|
125
125
|
*/
|
|
126
126
|
_registerHandlers() {
|
|
127
127
|
// ── ListTools: 按 tier 过滤 ──
|
|
128
|
-
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
128
|
+
this.sdkServer.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
129
129
|
const tierName = process.env.ASD_MCP_TIER || 'agent';
|
|
130
130
|
const maxTier = TIER_ORDER[tierName] ?? TIER_ORDER.agent;
|
|
131
131
|
const visible = TOOLS.filter((t) => (TIER_ORDER[t.tier || 'agent'] ?? 0) <= maxTier);
|
|
132
132
|
return { tools: visible };
|
|
133
133
|
});
|
|
134
134
|
// ── CallTool: 路由到 handler ──
|
|
135
|
-
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
135
|
+
this.sdkServer.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
136
136
|
const { name, arguments: args } = request.params;
|
|
137
137
|
const t0 = Date.now();
|
|
138
138
|
try {
|
|
@@ -240,7 +240,6 @@ export class McpServer {
|
|
|
240
240
|
}
|
|
241
241
|
/**
|
|
242
242
|
* 获取 decisions 摘要(带缓存 + 防并发)
|
|
243
|
-
* @private
|
|
244
243
|
* @returns >>}
|
|
245
244
|
*/
|
|
246
245
|
async _getDecisionsSummary() {
|
|
@@ -271,7 +270,6 @@ export class McpServer {
|
|
|
271
270
|
}
|
|
272
271
|
/**
|
|
273
272
|
* 从 DB 查询 decisions 摘要(仅 id + title)
|
|
274
|
-
* @private
|
|
275
273
|
*/
|
|
276
274
|
async _fetchDecisionsSummary() {
|
|
277
275
|
const cache = this._decisionCache;
|
|
@@ -297,7 +295,6 @@ export class McpServer {
|
|
|
297
295
|
}
|
|
298
296
|
/**
|
|
299
297
|
* 从 ready 响应结果中刷新缓存(避免额外 DB 查询)
|
|
300
|
-
* @private
|
|
301
298
|
*/
|
|
302
299
|
_refreshCacheFromReady(readyResult) {
|
|
303
300
|
try {
|
|
@@ -316,7 +313,6 @@ export class McpServer {
|
|
|
316
313
|
}
|
|
317
314
|
/**
|
|
318
315
|
* 解析工具名到 handler 函数(V3 整合版)
|
|
319
|
-
* @private
|
|
320
316
|
*/
|
|
321
317
|
_resolveHandler(name) {
|
|
322
318
|
const HANDLER_MAP = {
|
|
@@ -444,7 +440,7 @@ export class McpServer {
|
|
|
444
440
|
/* non-blocking */
|
|
445
441
|
}
|
|
446
442
|
const transport = new StdioServerTransport();
|
|
447
|
-
await this.
|
|
443
|
+
await this.sdkServer.connect(transport);
|
|
448
444
|
const tierName = process.env.ASD_MCP_TIER || 'agent';
|
|
449
445
|
const maxTier = TIER_ORDER[tierName] ?? TIER_ORDER.agent;
|
|
450
446
|
const visibleCount = TOOLS.filter((t) => (TIER_ORDER[t.tier || 'agent'] ?? 0) <= maxTier).length;
|
|
@@ -452,8 +448,8 @@ export class McpServer {
|
|
|
452
448
|
process.stderr.write(`AutoSnippet MCP ready — ${visibleCount} tools [tier=${tierName}]\n`);
|
|
453
449
|
}
|
|
454
450
|
async shutdown() {
|
|
455
|
-
if (this.
|
|
456
|
-
await this.
|
|
451
|
+
if (this.sdkServer) {
|
|
452
|
+
await this.sdkServer.close();
|
|
457
453
|
}
|
|
458
454
|
if (this.bootstrap) {
|
|
459
455
|
await this.bootstrap.shutdown();
|
|
@@ -30,15 +30,15 @@ const MAX_SUBMISSIONS_PER_DIM = 20;
|
|
|
30
30
|
const MAX_NEGATIVE_SIGNALS = 30;
|
|
31
31
|
// ── 主类 ────────────────────────────────────────────────────
|
|
32
32
|
export class ExternalSubmissionTracker {
|
|
33
|
-
/**
|
|
33
|
+
/** dimId → 提交记录列表 */
|
|
34
34
|
#dimensionSubmissions = new Map();
|
|
35
|
-
/**
|
|
35
|
+
/** filePath → 引用此文件的 dimId 集合 */
|
|
36
36
|
#fileEvidenceMap = new Map();
|
|
37
|
-
/**
|
|
37
|
+
/** 负空间信号 */
|
|
38
38
|
#negativeSignals = [];
|
|
39
|
-
/**
|
|
39
|
+
/** dimId → 被拒绝的提交标题列表 */
|
|
40
40
|
#rejections = new Map();
|
|
41
|
-
/**
|
|
41
|
+
/** 已使用的唯一 trigger 集合 (跨维度) */
|
|
42
42
|
#usedTriggers = new Set();
|
|
43
43
|
// ─── 提交记录 ─────────────────────────────────────────
|
|
44
44
|
/**
|
|
@@ -77,8 +77,9 @@ function enrichDimensionTask(dim, tier) {
|
|
|
77
77
|
},
|
|
78
78
|
{
|
|
79
79
|
phase: '4. 提交',
|
|
80
|
-
action: '
|
|
80
|
+
action: '按项目特写格式提交知识候选(**最少 3 条,目标 5 条**,将不同关注点拆为独立候选)',
|
|
81
81
|
qualityChecklist: [
|
|
82
|
+
'候选数量 ≥3(1-2 条是不合格的,不同关注点必须拆分为独立候选)',
|
|
82
83
|
'每个 content ≥200 字符',
|
|
83
84
|
'每个候选引用 ≥3 个文件路径',
|
|
84
85
|
'coreCode 提供可复制的完整代码骨架',
|
|
@@ -95,7 +96,7 @@ function enrichDimensionTask(dim, tier) {
|
|
|
95
96
|
// ── submissionSpec: 嵌入 Quality Checklist ──
|
|
96
97
|
const submissionSpec = {
|
|
97
98
|
knowledgeTypes: dim.knowledgeTypes || [],
|
|
98
|
-
targetCandidateCount: '3-
|
|
99
|
+
targetCandidateCount: '每维度最少 3 条,目标 5 条(1-2 条不合格)。将不同关注点(如命名规范 vs 文件组织 vs 注释风格)拆分为独立候选,不要合并到一条中。',
|
|
99
100
|
contentStyle: PROJECT_SNAPSHOT_STYLE_GUIDE.split('\n')
|
|
100
101
|
.filter((l) => !l.startsWith('#') || l.startsWith('##'))
|
|
101
102
|
.filter((l) => l.trim())
|
|
@@ -645,7 +646,7 @@ function buildExecutionPlan(activeDimensions) {
|
|
|
645
646
|
return {
|
|
646
647
|
tiers: plan,
|
|
647
648
|
totalDimensions: activeDimensions.length,
|
|
648
|
-
workflow: '对每个维度: (1) 用你的原生能力阅读代码分析 → (2) 调用 autosnippet_submit_knowledge_batch
|
|
649
|
+
workflow: '对每个维度: (1) 用你的原生能力阅读代码分析 → (2) 调用 autosnippet_submit_knowledge_batch 批量提交候选(**每维度最少 3 条,目标 5 条**,将不同关注点拆分为独立候选,1-2 条视为不合格) → (3) 调用 autosnippet_dimension_complete 完成维度(必须传 referencedFiles=[分析过的文件路径] 和 keyFindings=[3-5条关键发现])',
|
|
649
650
|
};
|
|
650
651
|
}
|
|
651
652
|
// ── Mission Briefing 主构建函数 ──────────────────────────────
|
|
@@ -99,7 +99,7 @@ export declare class BootstrapSnapshot {
|
|
|
99
99
|
*
|
|
100
100
|
* @param params.sessionId Bootstrap 会话 ID
|
|
101
101
|
* @param params.projectRoot 项目根目录
|
|
102
|
-
* @param
|
|
102
|
+
* @param params.allFiles 扫描到的文件列表
|
|
103
103
|
* @param params.dimensionStats { dimId: { referencedFiles: string[] } }
|
|
104
104
|
* @param [params.episodicData] EpisodicMemory.toJSON()
|
|
105
105
|
* @param [params.meta] { durationMs, candidateCount, primaryLang }
|
|
@@ -126,7 +126,7 @@ export declare class BootstrapSnapshot {
|
|
|
126
126
|
* 计算当前文件与快照的 diff
|
|
127
127
|
*
|
|
128
128
|
* @param snapshot getLatest() 返回的快照
|
|
129
|
-
* @param
|
|
129
|
+
* @param currentFiles 当前文件列表
|
|
130
130
|
* @returns }
|
|
131
131
|
*/
|
|
132
132
|
computeDiff(snapshot: SnapshotData, currentFiles: SnapshotFile[], projectRoot: string): DiffResult;
|
|
@@ -139,7 +139,7 @@ export declare class BootstrapSnapshot {
|
|
|
139
139
|
* 3. 如果变更比例超过阈值 → 建议全量
|
|
140
140
|
*
|
|
141
141
|
* @param snapshot 上次快照
|
|
142
|
-
* @param
|
|
142
|
+
* @param diff
|
|
143
143
|
* @param allDimIds 所有可用维度 ID
|
|
144
144
|
* @returns }
|
|
145
145
|
*/
|
|
@@ -47,7 +47,7 @@ export class BootstrapSnapshot {
|
|
|
47
47
|
*
|
|
48
48
|
* @param params.sessionId Bootstrap 会话 ID
|
|
49
49
|
* @param params.projectRoot 项目根目录
|
|
50
|
-
* @param
|
|
50
|
+
* @param params.allFiles 扫描到的文件列表
|
|
51
51
|
* @param params.dimensionStats { dimId: { referencedFiles: string[] } }
|
|
52
52
|
* @param [params.episodicData] EpisodicMemory.toJSON()
|
|
53
53
|
* @param [params.meta] { durationMs, candidateCount, primaryLang }
|
|
@@ -169,7 +169,7 @@ export class BootstrapSnapshot {
|
|
|
169
169
|
* 计算当前文件与快照的 diff
|
|
170
170
|
*
|
|
171
171
|
* @param snapshot getLatest() 返回的快照
|
|
172
|
-
* @param
|
|
172
|
+
* @param currentFiles 当前文件列表
|
|
173
173
|
* @returns }
|
|
174
174
|
*/
|
|
175
175
|
computeDiff(snapshot, currentFiles, projectRoot) {
|
|
@@ -212,7 +212,7 @@ export class BootstrapSnapshot {
|
|
|
212
212
|
* 3. 如果变更比例超过阈值 → 建议全量
|
|
213
213
|
*
|
|
214
214
|
* @param snapshot 上次快照
|
|
215
|
-
* @param
|
|
215
|
+
* @param diff
|
|
216
216
|
* @param allDimIds 所有可用维度 ID
|
|
217
217
|
* @returns }
|
|
218
218
|
*/
|
|
@@ -25,7 +25,7 @@ export declare class IncrementalBootstrap {
|
|
|
25
25
|
/**
|
|
26
26
|
* 评估增量可行性 — 在 bootstrap 流程最开始调用
|
|
27
27
|
*
|
|
28
|
-
* @param
|
|
28
|
+
* @param currentFiles 当前扫描到的文件
|
|
29
29
|
* @param allDimIds 所有可用维度 ID
|
|
30
30
|
*/
|
|
31
31
|
evaluate(currentFiles: BootstrapFile[], allDimIds: string[]): {
|
|
@@ -31,7 +31,7 @@ export class IncrementalBootstrap {
|
|
|
31
31
|
/**
|
|
32
32
|
* 评估增量可行性 — 在 bootstrap 流程最开始调用
|
|
33
33
|
*
|
|
34
|
-
* @param
|
|
34
|
+
* @param currentFiles 当前扫描到的文件
|
|
35
35
|
* @param allDimIds 所有可用维度 ID
|
|
36
36
|
*/
|
|
37
37
|
evaluate(currentFiles, allDimIds) {
|
|
@@ -25,11 +25,11 @@ export class DimensionContext {
|
|
|
25
25
|
submittedCandidates;
|
|
26
26
|
/** @param projectContext 项目基础信息 (全程不变) */
|
|
27
27
|
constructor(projectContext) {
|
|
28
|
-
/**
|
|
28
|
+
/** 项目基础信息 */
|
|
29
29
|
this.projectContext = projectContext;
|
|
30
|
-
/**
|
|
30
|
+
/** 已完成维度的摘要 */
|
|
31
31
|
this.completedDimensions = new Map();
|
|
32
|
-
/**
|
|
32
|
+
/** 已提交候选的摘要 */
|
|
33
33
|
this.submittedCandidates = [];
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
@@ -53,7 +53,7 @@ export const DIMENSION_SOP = {
|
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
phase: '4. 提交',
|
|
56
|
-
action: '
|
|
56
|
+
action: '按项目特写格式提交知识候选(**最少 3 条,目标 5 条**),每个候选聚焦一种具体代码规范(如命名约定、注释风格、文件组织分别独立提交)',
|
|
57
57
|
qualityChecklist: [
|
|
58
58
|
'每个 content ≥200 字符',
|
|
59
59
|
'每个候选引用 ≥3 个文件路径',
|
|
@@ -106,8 +106,9 @@ export const DIMENSION_SOP = {
|
|
|
106
106
|
},
|
|
107
107
|
{
|
|
108
108
|
phase: '4. 提交',
|
|
109
|
-
action: '
|
|
109
|
+
action: '每种设计模式单独提交候选(**整体最少 3 条,目标 5 条**),包含标准实现代码和使用约束',
|
|
110
110
|
qualityChecklist: [
|
|
111
|
+
'候选数量 ≥3(将不同模式拆分为独立候选,如 Singleton 一条、Factory 一条、Delegate 一条)',
|
|
111
112
|
'每个候选只聚焦一种设计模式',
|
|
112
113
|
'content 包含 ✅ 正确写法 和 ❌ 禁止写法',
|
|
113
114
|
'coreCode 是可复制的模式骨架代码',
|
|
@@ -143,8 +144,9 @@ export const DIMENSION_SOP = {
|
|
|
143
144
|
},
|
|
144
145
|
{
|
|
145
146
|
phase: '4. 提交',
|
|
146
|
-
action: '
|
|
147
|
+
action: '分别提交分层架构、模块通信、依赖管理等知识候选(**最少 3 条,目标 5 条**)',
|
|
147
148
|
qualityChecklist: [
|
|
149
|
+
'候选数量 ≥3(分层结构、通信方式、依赖管理应分别提交)',
|
|
148
150
|
'content 包含架构层次图或文字描述',
|
|
149
151
|
'引用具体目录路径和核心文件',
|
|
150
152
|
'doClause 表达架构约束规则',
|
|
@@ -191,8 +193,9 @@ export const DIMENSION_SOP = {
|
|
|
191
193
|
},
|
|
192
194
|
{
|
|
193
195
|
phase: '4. 提交',
|
|
194
|
-
action: '
|
|
196
|
+
action: '每种最佳实践独立提交(**整体最少 3 条,目标 5 条**),包含正反面代码示例',
|
|
195
197
|
qualityChecklist: [
|
|
198
|
+
'候选数量 ≥3(错误处理、并发安全、日志规范等应分别提交)',
|
|
196
199
|
'每个候选聚焦一种实践(如"错误处理"或"并发安全")',
|
|
197
200
|
'content 包含 ✅ 推荐写法 和 ❌ 反模式',
|
|
198
201
|
'提供具体的统计数据(如"项目中 80% 的错误处理使用 Result 类型")',
|
|
@@ -242,8 +245,9 @@ export const DIMENSION_SOP = {
|
|
|
242
245
|
},
|
|
243
246
|
{
|
|
244
247
|
phase: '4. 提交',
|
|
245
|
-
action: '
|
|
248
|
+
action: '事件传播和数据流分别提交候选(**最少 3 条,目标 5 条**,将不同机制拆为独立候选)',
|
|
246
249
|
qualityChecklist: [
|
|
250
|
+
'候选数量 ≥3(Delegate、Notification、Callback 等每种机制独立提交)',
|
|
247
251
|
'每个候选聚焦一种事件/数据流模式',
|
|
248
252
|
'content 描述具体的事件传播链路(从触发到响应)',
|
|
249
253
|
'whenClause 描述何时使用此事件/数据模式',
|
|
@@ -293,8 +297,9 @@ export const DIMENSION_SOP = {
|
|
|
293
297
|
},
|
|
294
298
|
{
|
|
295
299
|
phase: '4. 提交',
|
|
296
|
-
action: '
|
|
300
|
+
action: '分模块提交项目特征候选(**最少 3 条,目标 5 条**:技术栈、依赖、入口点、基础设施等分别提交)',
|
|
297
301
|
qualityChecklist: [
|
|
302
|
+
'候选数量 ≥3(技术栈、三方依赖、启动流程等应独立成条)',
|
|
298
303
|
'content 包含具体的技术栈版本和依赖列表',
|
|
299
304
|
'引用配置文件和入口文件路径',
|
|
300
305
|
'每个候选只关注一个方面(如"三方依赖"或"启动流程")',
|
|
@@ -340,8 +345,9 @@ export const DIMENSION_SOP = {
|
|
|
340
345
|
},
|
|
341
346
|
{
|
|
342
347
|
phase: '4. 提交',
|
|
343
|
-
action: '
|
|
348
|
+
action: '每条开发约束单独提交(**最少 3 条,目标 5 条**),确保 doClause 表达清晰的强制规则',
|
|
344
349
|
qualityChecklist: [
|
|
350
|
+
'候选数量 ≥3(命名约束、线程约束、废弃 API 等应分别提交)',
|
|
345
351
|
'每个候选是一条明确的项目开发规则',
|
|
346
352
|
'doClause 以动词开头,表达强制性要求',
|
|
347
353
|
'dontClause 明确禁止的做法',
|
|
@@ -395,8 +401,9 @@ export const DIMENSION_SOP = {
|
|
|
395
401
|
},
|
|
396
402
|
{
|
|
397
403
|
phase: '4. 提交',
|
|
398
|
-
action: '宏定义、常量、Hook
|
|
404
|
+
action: '宏定义、常量、Hook 分别提交候选(**最少 3 条,目标 5 条**),确保包含完整实现代码',
|
|
399
405
|
qualityChecklist: [
|
|
406
|
+
'候选数量 ≥3(宏定义、常量定义、Method Swizzling 等应分别提交)',
|
|
400
407
|
'coreCode 包含完整的宏/常量/Hook 实现',
|
|
401
408
|
'content 包含使用频率和场景说明',
|
|
402
409
|
'Hook 候选必须说明原方法和替换方法的对应关系',
|
|
@@ -446,8 +453,9 @@ export const DIMENSION_SOP = {
|
|
|
446
453
|
},
|
|
447
454
|
{
|
|
448
455
|
phase: '4. 提交',
|
|
449
|
-
action: '
|
|
456
|
+
action: '按基类分组提交候选(**最少 3 条,目标 5 条**:NSString Category 一条、UIView Category 一条等)',
|
|
450
457
|
qualityChecklist: [
|
|
458
|
+
'候选数量 ≥3(不同基类的 Category 独立提交)',
|
|
451
459
|
'content 包含完整的方法签名列表',
|
|
452
460
|
'coreCode 包含最常用方法的实现代码',
|
|
453
461
|
'doClause 强制要求使用已有 Category 方法',
|
|
@@ -492,8 +500,9 @@ export const DIMENSION_SOP = {
|
|
|
492
500
|
},
|
|
493
501
|
{
|
|
494
502
|
phase: '4. 提交',
|
|
495
|
-
action: '分别提交 barrel export
|
|
503
|
+
action: '分别提交 barrel export 结构、导出约定、依赖约束等候选(**最少 3 条,目标 5 条**)',
|
|
496
504
|
qualityChecklist: [
|
|
505
|
+
'候选数量 ≥3(barrel export、命名导出约定、依赖方向约束等独立提交)',
|
|
497
506
|
'content 包含具体的 import/export 代码示例',
|
|
498
507
|
'引用 index.ts 和核心模块文件路径',
|
|
499
508
|
'doClause 表达导出约定规则',
|
|
@@ -541,8 +550,9 @@ export const DIMENSION_SOP = {
|
|
|
541
550
|
},
|
|
542
551
|
{
|
|
543
552
|
phase: '4. 提交',
|
|
544
|
-
action: '
|
|
553
|
+
action: '组件约定、状态管理、路由模式分别提交候选(**最少 3 条,目标 5 条**)',
|
|
545
554
|
qualityChecklist: [
|
|
555
|
+
'候选数量 ≥3(组件结构、状态管理、路由配置等独立提交)',
|
|
546
556
|
'content 包含组件/状态/路由的代码示例',
|
|
547
557
|
'引用具体框架版本和配置文件',
|
|
548
558
|
'coreCode 是可复制的标准写法模板',
|
|
@@ -588,8 +598,9 @@ export const DIMENSION_SOP = {
|
|
|
588
598
|
},
|
|
589
599
|
{
|
|
590
600
|
phase: '4. 提交',
|
|
591
|
-
action: '
|
|
601
|
+
action: '包结构、导入约定、类型标注分别提交候选(**最少 3 条,目标 5 条**)',
|
|
592
602
|
qualityChecklist: [
|
|
603
|
+
'候选数量 ≥3(包结构、导入风格、类型标注约定独立提交)',
|
|
593
604
|
'content 包含具体的 import/type hint 代码示例',
|
|
594
605
|
'引用 __init__.py 和核心模块路径',
|
|
595
606
|
'coreCode 展示标准的导入和类型标注写法',
|
|
@@ -637,8 +648,9 @@ export const DIMENSION_SOP = {
|
|
|
637
648
|
},
|
|
638
649
|
{
|
|
639
650
|
phase: '4. 提交',
|
|
640
|
-
action: 'DI、ORM、API
|
|
651
|
+
action: 'DI、ORM、API、自定义注解分别提交候选(**最少 3 条,目标 5 条**)',
|
|
641
652
|
qualityChecklist: [
|
|
653
|
+
'候选数量 ≥3(DI 注解、ORM 注解、API 注解等独立提交)',
|
|
642
654
|
'content 包含注解的完整使用示例',
|
|
643
655
|
'引用具体的类文件和配置',
|
|
644
656
|
'coreCode 展示标准的注解使用骨架',
|
|
@@ -676,8 +688,9 @@ export const DIMENSION_SOP = {
|
|
|
676
688
|
},
|
|
677
689
|
{
|
|
678
690
|
phase: '4. 提交',
|
|
679
|
-
action: '
|
|
691
|
+
action: '模块结构、接口约定、初始化模式分别提交候选(**最少 3 条,目标 5 条**)',
|
|
680
692
|
qualityChecklist: [
|
|
693
|
+
'候选数量 ≥3(模块结构、接口约定、初始化模式独立提交)',
|
|
681
694
|
'content 包含模块依赖关系和接口设计',
|
|
682
695
|
'引用 go.mod 和核心包路径',
|
|
683
696
|
'coreCode 展示标准的接口定义和使用',
|
|
@@ -147,6 +147,12 @@ export async function bootstrapExternal(ctx) {
|
|
|
147
147
|
return envelope({
|
|
148
148
|
success: true,
|
|
149
149
|
data: briefing,
|
|
150
|
+
message: `⚠️ Bootstrap 仅完成第一步(项目扫描),你必须继续完成全部 ${dimensions.length} 个维度的分析。` +
|
|
151
|
+
`请立即按 executionPlan.tiers 的顺序,对每个维度执行:` +
|
|
152
|
+
`(1) 用你的代码阅读能力分析该维度相关文件 → ` +
|
|
153
|
+
`(2) 调用 autosnippet_submit_knowledge_batch 提交候选知识(**每维度最少 3 条,目标 5 条**,不同关注点拆为独立候选) → ` +
|
|
154
|
+
`(3) 调用 autosnippet_dimension_complete 标记维度完成。` +
|
|
155
|
+
`不要停下来等待用户确认,直接开始第一个维度。`,
|
|
150
156
|
meta: { tool: 'autosnippet_bootstrap', responseTimeMs: Date.now() - t0 },
|
|
151
157
|
});
|
|
152
158
|
}
|
|
@@ -176,10 +176,64 @@ export async function dimensionComplete(ctx, args) {
|
|
|
176
176
|
}
|
|
177
177
|
// ═══════════════════════════════════════════════════════════
|
|
178
178
|
// 2. Skill 生成 (skillWorthy 维度) — 使用共享 skill-generator
|
|
179
|
+
// 如果 analysisText 太短,自动从已提交的候选知识中合成结构化内容
|
|
179
180
|
// ═══════════════════════════════════════════════════════════
|
|
180
181
|
let skillCreated = false;
|
|
181
182
|
if (dim.skillWorthy) {
|
|
182
|
-
|
|
183
|
+
let effectiveAnalysis = analysisText;
|
|
184
|
+
// 当 analysisText 不足以通过质量门控时,从候选知识中合成
|
|
185
|
+
if (analysisText.length < 500 && submittedRecipeIds.length > 0) {
|
|
186
|
+
try {
|
|
187
|
+
const knowledgeService = ctx.container.get('knowledgeService');
|
|
188
|
+
if (knowledgeService) {
|
|
189
|
+
const parts = [`## ${dim.label || dimensionId} — 分析报告\n`];
|
|
190
|
+
if (analysisText.trim().length > 0) {
|
|
191
|
+
parts.push(analysisText.trim(), '');
|
|
192
|
+
}
|
|
193
|
+
for (const recipeId of submittedRecipeIds) {
|
|
194
|
+
const entry = await knowledgeService.get(recipeId);
|
|
195
|
+
if (!entry) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
parts.push(`### ${entry.title || 'Untitled'}`);
|
|
199
|
+
if (entry.description) {
|
|
200
|
+
parts.push(entry.description);
|
|
201
|
+
}
|
|
202
|
+
if (entry.whenClause || entry.doClause || entry.dontClause) {
|
|
203
|
+
parts.push('');
|
|
204
|
+
if (entry.whenClause) {
|
|
205
|
+
parts.push(`- **When**: ${entry.whenClause}`);
|
|
206
|
+
}
|
|
207
|
+
if (entry.doClause) {
|
|
208
|
+
parts.push(`- **Do**: ${entry.doClause}`);
|
|
209
|
+
}
|
|
210
|
+
if (entry.dontClause) {
|
|
211
|
+
parts.push(`- **Don't**: ${entry.dontClause}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (entry.coreCode) {
|
|
215
|
+
parts.push('', '```', entry.coreCode.substring(0, 500), '```');
|
|
216
|
+
}
|
|
217
|
+
parts.push('');
|
|
218
|
+
}
|
|
219
|
+
if (keyFindings.length > 0) {
|
|
220
|
+
parts.push('## Key Findings', '');
|
|
221
|
+
for (const f of keyFindings) {
|
|
222
|
+
parts.push(`- ${f}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const synthesized = parts.join('\n');
|
|
226
|
+
if (synthesized.length > effectiveAnalysis.length) {
|
|
227
|
+
effectiveAnalysis = synthesized;
|
|
228
|
+
logger.info(`[DimensionComplete] Synthesized analysisText for "${dimensionId}" from ${submittedRecipeIds.length} candidates (${analysisText.length} → ${synthesized.length} chars)`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch (e) {
|
|
233
|
+
logger.debug(`[DimensionComplete] Failed to synthesize analysisText: ${e instanceof Error ? e.message : String(e)}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const skillResult = await generateSkill(ctx, dim, effectiveAnalysis, referencedFiles, keyFindings, 'external-agent-bootstrap');
|
|
183
237
|
skillCreated = skillResult.success;
|
|
184
238
|
if (!skillCreated) {
|
|
185
239
|
logger.warn(`[DimensionComplete] Skill skipped for "${dimensionId}": ${skillResult.error}`);
|
|
@@ -63,16 +63,11 @@ function _parseSkillMeta(skillName, baseDir = SKILLS_DIR) {
|
|
|
63
63
|
}
|
|
64
64
|
/** Skill 适用场景映射 — 帮助 Agent 判断何时该加载哪个 Skill */
|
|
65
65
|
const SKILL_USE_CASES = {
|
|
66
|
-
'autosnippet-
|
|
67
|
-
'autosnippet-coldstart': '冷启动/初始化知识库时的完整 9 维度分析指南',
|
|
68
|
-
'autosnippet-analysis': '深度项目分析 — 扫描 + 语义补齐 + 缺口填充',
|
|
69
|
-
'autosnippet-candidates': '生成/提交高质量候选(V2 全字段结构化)',
|
|
70
|
-
'autosnippet-create': '将代码提交到知识库(Dashboard 入口)',
|
|
66
|
+
'autosnippet-create': '将代码模式/规则/事实提交到知识库',
|
|
71
67
|
'autosnippet-guard': '代码规范审计(Guard 规则检查)',
|
|
72
68
|
'autosnippet-recipes': '查询/使用项目标准(Recipe 上下文检索)',
|
|
73
|
-
'autosnippet-structure': '了解项目结构(
|
|
74
|
-
'autosnippet-
|
|
75
|
-
'autosnippet-lifecycle': '了解 Recipe 生命周期与 Agent 权限边界',
|
|
69
|
+
'autosnippet-structure': '了解项目结构(Target / 依赖图谱 / 知识图谱)',
|
|
70
|
+
'autosnippet-devdocs': '保存开发文档(架构决策、调试报告、设计文档)',
|
|
76
71
|
};
|
|
77
72
|
// ═══════════════════════════════════════════════════════════
|
|
78
73
|
// Handler: listSkills
|
|
@@ -141,7 +136,7 @@ export function listSkills(ctx) {
|
|
|
141
136
|
data: {
|
|
142
137
|
skills,
|
|
143
138
|
total: skills.length,
|
|
144
|
-
hint: '根据当前任务选择合适的 Skill 加载(load_skill
|
|
139
|
+
hint: '根据当前任务选择合适的 Skill 加载(load_skill)。',
|
|
145
140
|
_meta: { signalSuggestions: suggestionCount },
|
|
146
141
|
},
|
|
147
142
|
});
|
|
@@ -689,28 +684,11 @@ function _listExistingProjectSkillNames(ctx) {
|
|
|
689
684
|
/** 推荐相关 Skills(基于静态映射) */
|
|
690
685
|
function _getRelatedSkills(skillName) {
|
|
691
686
|
const relations = {
|
|
692
|
-
'autosnippet-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
],
|
|
697
|
-
'autosnippet-analysis': [
|
|
698
|
-
'autosnippet-candidates',
|
|
699
|
-
'autosnippet-coldstart',
|
|
700
|
-
'autosnippet-structure',
|
|
701
|
-
],
|
|
702
|
-
'autosnippet-candidates': [
|
|
703
|
-
'autosnippet-analysis',
|
|
704
|
-
'autosnippet-create',
|
|
705
|
-
'autosnippet-lifecycle',
|
|
706
|
-
],
|
|
707
|
-
'autosnippet-create': ['autosnippet-candidates', 'autosnippet-lifecycle'],
|
|
708
|
-
'autosnippet-guard': ['autosnippet-recipes', 'autosnippet-analysis'],
|
|
709
|
-
'autosnippet-recipes': ['autosnippet-guard', 'autosnippet-structure', 'autosnippet-concepts'],
|
|
710
|
-
'autosnippet-structure': ['autosnippet-analysis', 'autosnippet-coldstart'],
|
|
711
|
-
'autosnippet-concepts': ['autosnippet-recipes', 'autosnippet-lifecycle'],
|
|
712
|
-
'autosnippet-lifecycle': ['autosnippet-candidates', 'autosnippet-concepts'],
|
|
713
|
-
'autosnippet-intent': [],
|
|
687
|
+
'autosnippet-create': ['autosnippet-recipes'],
|
|
688
|
+
'autosnippet-guard': ['autosnippet-recipes'],
|
|
689
|
+
'autosnippet-recipes': ['autosnippet-guard', 'autosnippet-structure', 'autosnippet-create'],
|
|
690
|
+
'autosnippet-structure': ['autosnippet-recipes', 'autosnippet-create'],
|
|
691
|
+
'autosnippet-devdocs': ['autosnippet-recipes', 'autosnippet-create'],
|
|
714
692
|
};
|
|
715
693
|
return relations[skillName] || [];
|
|
716
694
|
}
|
|
@@ -116,7 +116,7 @@ export async function health(ctx) {
|
|
|
116
116
|
}
|
|
117
117
|
if (!knowledgeBase || knowledgeBase.recipes.total === 0) {
|
|
118
118
|
actionHints.push('知识库为空,建议执行冷启动:(1) 调用 autosnippet_bootstrap 获取 Mission Briefing → (2) 按维度分析代码并提交知识 → (3) 调用 autosnippet_dimension_complete 完成每个维度。');
|
|
119
|
-
actionHints.push('💡
|
|
119
|
+
actionHints.push('💡 冷启动指引:调用 autosnippet_bootstrap 获取 Mission Briefing → 按维度分析代码 → 调用 autosnippet_dimension_complete 完成每个维度');
|
|
120
120
|
}
|
|
121
121
|
return envelope({
|
|
122
122
|
success: true,
|
|
@@ -243,7 +243,7 @@ export function capabilities() {
|
|
|
243
243
|
{
|
|
244
244
|
name: '冷启动(外部 Agent)',
|
|
245
245
|
steps: [
|
|
246
|
-
'⚠️
|
|
246
|
+
'⚠️ 调用 autosnippet_bootstrap 获取 Mission Briefing(无参数直接调用)',
|
|
247
247
|
'bootstrap(获取 Mission Briefing,无参数直接调用)',
|
|
248
248
|
'按 Briefing 中的 submissionSchema.example 格式提交知识(注意: content 和 reasoning 都是 JSON 对象)',
|
|
249
249
|
'Agent 分析代码 + submit_knowledge / submit_knowledge_batch × N',
|
|
@@ -154,13 +154,28 @@ async function _close(ctx, svc, args) {
|
|
|
154
154
|
});
|
|
155
155
|
}
|
|
156
156
|
const { task, newlyReady } = await svc.close(args.id, args.reason || 'Completed');
|
|
157
|
+
const lines = [`✅ Closed: ${args.id} — ${task.title}`];
|
|
158
|
+
if (args.reason && args.reason !== 'Completed') {
|
|
159
|
+
lines.push(`Reason: ${args.reason}`);
|
|
160
|
+
}
|
|
161
|
+
if (newlyReady.length > 0) {
|
|
162
|
+
lines.push(`→ ${newlyReady.length} task(s) newly ready`);
|
|
163
|
+
}
|
|
164
|
+
lines.push('');
|
|
165
|
+
lines.push('⚠️ REQUIRED: You MUST call autosnippet_guard (no args) NOW to review changed files for compliance violations. Do NOT proceed to the next task until guard review passes.');
|
|
157
166
|
return envelope({
|
|
158
167
|
success: true,
|
|
159
168
|
data: {
|
|
160
169
|
closed: task.toJSON(),
|
|
161
170
|
newlyReady,
|
|
171
|
+
nextAction: {
|
|
172
|
+
tool: 'autosnippet_guard',
|
|
173
|
+
args: {},
|
|
174
|
+
required: true,
|
|
175
|
+
reason: 'Post-close compliance review — check diff for violations before moving on.',
|
|
176
|
+
},
|
|
162
177
|
},
|
|
163
|
-
message:
|
|
178
|
+
message: lines.join('\n'),
|
|
164
179
|
meta: { tool: 'autosnippet_task' },
|
|
165
180
|
});
|
|
166
181
|
}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP 工具定义 — V3 整合版 (18 agent + 4 admin = 22 工具)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 每个工具声明包含 name、tier(agent/admin)、description 和 inputSchema。
|
|
5
|
+
* description 是 Agent 选择工具的关键 — 使用 bullet list 列出所有 operation 及其用途。
|
|
6
|
+
* inputSchema 由 Zod Schema 自动生成(zodToMcpSchema),参数的 .describe() 会转为 JSON Schema description。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Agent 工具 (18):
|
|
9
|
+
* 1-7: 查询工具 (health/search/knowledge/structure/graph/call_context/guard)
|
|
10
|
+
* 8-10: 写入工具 (submit_knowledge/submit_knowledge_batch/save_document)
|
|
11
|
+
* 11: Skill 管理 (skill)
|
|
12
|
+
* 12-15: 冷启动 (bootstrap/dimension_complete/wiki_plan/wiki_finalize)
|
|
13
|
+
* 16: 自发现 (capabilities)
|
|
14
|
+
* 17: 任务管理 (task)
|
|
10
15
|
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
* - autosnippet_dimension_complete: 维度分析完成通知
|
|
14
|
-
* - autosnippet_wiki_plan: Wiki 主题规划
|
|
15
|
-
* - autosnippet_wiki_finalize: Wiki 元数据 + 去重
|
|
16
|
+
* Admin 工具 (4):
|
|
17
|
+
* 18-21: enrich_candidates/knowledge_lifecycle/validate_candidate/check_duplicate
|
|
16
18
|
*/
|
|
17
19
|
export declare const TIER_ORDER: {
|
|
18
20
|
agent: number;
|