@winspan/claude-forge 0.2.9 → 0.2.13
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/dist/autopilot/intent-engine.js +1 -1
- package/dist/autopilot/intent-engine.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/pre-tool-use-handler.js +6 -2
- package/dist/daemon/handlers/pre-tool-use-handler.js.map +1 -1
- package/dist/daemon/handlers/stop-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/stop-handler.js +40 -22
- package/dist/daemon/handlers/stop-handler.js.map +1 -1
- package/dist/daemon/handlers/user-prompt-handler.d.ts +9 -0
- package/dist/daemon/handlers/user-prompt-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt-handler.js +107 -34
- package/dist/daemon/handlers/user-prompt-handler.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +28 -5
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/tool-summary.d.ts +9 -0
- package/dist/daemon/tool-summary.d.ts.map +1 -0
- package/dist/daemon/tool-summary.js +63 -0
- package/dist/daemon/tool-summary.js.map +1 -0
- package/dist/distill/trigger.d.ts.map +1 -1
- package/dist/distill/trigger.js +2 -1
- package/dist/distill/trigger.js.map +1 -1
- package/dist/pattern-engine/convention-pattern-generator.d.ts.map +1 -1
- package/dist/pattern-engine/convention-pattern-generator.js +2 -1
- package/dist/pattern-engine/convention-pattern-generator.js.map +1 -1
- package/dist/pattern-engine/index.d.ts +12 -5
- package/dist/pattern-engine/index.d.ts.map +1 -1
- package/dist/pattern-engine/index.js +77 -22
- package/dist/pattern-engine/index.js.map +1 -1
- package/dist/pattern-engine/pattern-loader.js +5 -5
- package/dist/pattern-engine/pattern-loader.js.map +1 -1
- package/dist/pattern-engine/pattern-router.js +5 -5
- package/dist/pattern-engine/pattern-router.js.map +1 -1
- package/dist/skill-registry/orchestrator.d.ts.map +1 -1
- package/dist/skill-registry/orchestrator.js +9 -3
- package/dist/skill-registry/orchestrator.js.map +1 -1
- package/dist/skill-registry/registry.d.ts.map +1 -1
- package/dist/skill-registry/registry.js +1 -0
- package/dist/skill-registry/registry.js.map +1 -1
- package/package.json +1 -1
|
@@ -28,7 +28,7 @@ export class IntentEngine {
|
|
|
28
28
|
// 注意:有会话上下文时(多轮对话中),短输入可能是确认回复,不应被快速过滤
|
|
29
29
|
const quickResult = this.quickFilter(userPrompt, !!conversationHistory);
|
|
30
30
|
if (quickResult) {
|
|
31
|
-
logger.info(
|
|
31
|
+
logger.info(`快速判定:${quickResult.complexity} | 理由=${quickResult.reasoning}`);
|
|
32
32
|
return quickResult;
|
|
33
33
|
}
|
|
34
34
|
// 清理过期缓存条目(每次 analyze 时执行,避免长期积累)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-engine.js","sourceRoot":"","sources":["../../src/autopilot/intent-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAe5C;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACf,GAAG,CAAa;IACxB,mCAAmC;IAC3B,cAAc,GAAG,IAAI,GAAG,EAA8C,CAAC;IAC/E,iCAAiC;IACzB,cAAc,GAAG,IAAI,GAAG,EAA8C,CAAC;IACvE,MAAM,CAAU,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;IAE7D,YAAY,GAAe;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CACX,UAAkB,EAClB,WAAmB,EACnB,SAAkB,EAClB,mBAA4B;QAE5B,iBAAiB;QACjB,uCAAuC;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;QACxE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"intent-engine.js","sourceRoot":"","sources":["../../src/autopilot/intent-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-tool-use-handler.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/pre-tool-use-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKpD,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;gBAE3C,GAAG,EAAE,cAAc;IAIzB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"pre-tool-use-handler.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/pre-tool-use-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKpD,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;gBAE3C,GAAG,EAAE,cAAc;IAIzB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAkD7D,OAAO,CAAC,mBAAmB;CAsB5B"}
|
|
@@ -23,20 +23,24 @@ export class PreToolUseHandler extends BaseHookHandler {
|
|
|
23
23
|
if (skillRec) {
|
|
24
24
|
// 提取匹配的技能名列表作为日志预览(跳过标题行,提取 **name** 部分)
|
|
25
25
|
const skillNames = skillRec.match(/\*\*([^*]+)\*\*/g)?.map(s => s.replace(/\*\*/g, '')).join(', ') || '(unknown)';
|
|
26
|
-
logger.info(
|
|
26
|
+
logger.info(`已注入技能推荐(触发工具:${event.tool_name}):${skillNames}`);
|
|
27
27
|
decision = this.appendContext(decision, ForgeFormatter.formatModuleNotification('skill', skillRec));
|
|
28
28
|
}
|
|
29
|
+
else {
|
|
30
|
+
logger.debug(`未匹配到相关技能(工具:${event.tool_name})`);
|
|
31
|
+
}
|
|
29
32
|
// 3. Pipeline 阶段指令注入
|
|
30
33
|
if (pipelineEngine) {
|
|
31
34
|
const pipelineInstruction = await pipelineEngine.handlePreToolUse(event);
|
|
32
35
|
if (pipelineInstruction) {
|
|
33
|
-
logger.info(
|
|
36
|
+
logger.info(`已注入编排阶段指令:${pipelineInstruction.substring(0, 80)}...`);
|
|
34
37
|
decision = this.appendContext(decision, ForgeFormatter.formatModuleNotification('pipeline', pipelineInstruction));
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
// 4. 首次事件后台检查(不阻塞响应)
|
|
38
41
|
if (!checkedProjects.has(event.project_path)) {
|
|
39
42
|
checkedProjects.add(event.project_path);
|
|
43
|
+
logger.info(`启动后台检查(CLAUDE.md + 续接状态)`);
|
|
40
44
|
this.runBackgroundChecks(event.project_path, config.claudemd.auto_generate, resumeEngine);
|
|
41
45
|
}
|
|
42
46
|
return decision ?? undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-tool-use-handler.js","sourceRoot":"","sources":["../../../src/daemon/handlers/pre-tool-use-handler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACnC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAEvD,YAAY,GAAmB;QAC7B,KAAK,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAiB;QAC5B,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAEzG,IAAI,QAAQ,GAAwB,IAAI,CAAC;QAEzC,0BAA0B;QAC1B,IAAI,aAAa,EAAE,CAAC;YAClB,QAAQ,GAAG,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,oBAAoB,KAAK,CAAC,SAAS,aAAa,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC/E,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,yCAAyC;YACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;YAClH,MAAM,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"pre-tool-use-handler.js","sourceRoot":"","sources":["../../../src/daemon/handlers/pre-tool-use-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-handler.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/stop-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKpD,qBAAa,WAAY,SAAQ,eAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,SAAS,CAAK;gBAEV,GAAG,EAAE,cAAc;IAKzB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"stop-handler.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/stop-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKpD,qBAAa,WAAY,SAAQ,eAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,SAAS,CAAK;gBAEV,GAAG,EAAE,cAAc;IAKzB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CAsG9D"}
|
|
@@ -13,15 +13,15 @@ export class StopHandler extends BaseHookHandler {
|
|
|
13
13
|
async handle(event) {
|
|
14
14
|
const { resumeEngine, qualityGate, trigger, config } = this.ctx;
|
|
15
15
|
this.stopCount++;
|
|
16
|
-
logger.info(
|
|
16
|
+
logger.info(`会话结束 | 第 ${this.stopCount} 次 Stop | 项目=${event.project_path.split('/').slice(-2).join('/')}`);
|
|
17
17
|
// 1. 保存续接摘要
|
|
18
18
|
if (resumeEngine) {
|
|
19
19
|
try {
|
|
20
20
|
await resumeEngine.saveOnStop(event.session_id, event.project_path);
|
|
21
|
-
logger.info(
|
|
21
|
+
logger.info(`续接快照已保存`);
|
|
22
22
|
}
|
|
23
23
|
catch (err) {
|
|
24
|
-
logger.warn(
|
|
24
|
+
logger.warn(`续接快照保存失败:${err}`);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
// 2. CLAUDE.md 检查
|
|
@@ -32,7 +32,7 @@ export class StopHandler extends BaseHookHandler {
|
|
|
32
32
|
if (qualityGate) {
|
|
33
33
|
const failures = qualityGate.getUnresolvedFailures();
|
|
34
34
|
if (failures.length > 0) {
|
|
35
|
-
logger.warn(
|
|
35
|
+
logger.warn(`质量门禁发现 ${failures.length} 个未解决的失败项,阻断会话结束`);
|
|
36
36
|
const issueLines = [];
|
|
37
37
|
for (const f of failures) {
|
|
38
38
|
issueLines.push(`- ${f.summary}`);
|
|
@@ -46,7 +46,7 @@ export class StopHandler extends BaseHookHandler {
|
|
|
46
46
|
}
|
|
47
47
|
const report = qualityGate.generateReport();
|
|
48
48
|
if (report && report !== '暂无审查记录。') {
|
|
49
|
-
logger.info(
|
|
49
|
+
logger.info(`质量门禁报告:\n${report}`);
|
|
50
50
|
}
|
|
51
51
|
qualityGate.reset();
|
|
52
52
|
}
|
|
@@ -56,33 +56,51 @@ export class StopHandler extends BaseHookHandler {
|
|
|
56
56
|
session_id: event.session_id,
|
|
57
57
|
project_path: event.project_path,
|
|
58
58
|
}).length;
|
|
59
|
-
logger.info(
|
|
59
|
+
logger.info(`开始蒸馏 | 事件数=${eventsCount}`);
|
|
60
60
|
await trigger.onStopHook(event.session_id, event.project_path);
|
|
61
|
-
logger.info(
|
|
61
|
+
logger.info(`蒸馏完成:decisions.md 和 timeline.md 已更新`);
|
|
62
62
|
if (this.ctx.orchestration && config.orchestration.notify_on_distill) {
|
|
63
63
|
this.ctx.orchestration.pushNotification('[Forge] 会话蒸馏完成');
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
// 5-8. 异步清理任务(独立 try/catch,互不影响)
|
|
67
|
-
// 使用 Promise.allSettled 确保所有任务的日志都能输出
|
|
68
67
|
const cleanupTasks = [];
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
68
|
+
const skipped = [];
|
|
69
|
+
if (this.stopCount % 5 === 0) {
|
|
70
|
+
cleanupTasks.push({ name: 'CLAUDE.md 精炼', task: this.cleanup.refineClaudeMd(event) });
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
skipped.push(`CLAUDE.md 精炼(每5次,当前第${this.stopCount}次)`);
|
|
74
|
+
}
|
|
75
|
+
cleanupTasks.push({ name: '文档同步', task: this.cleanup.syncDocs(event) });
|
|
76
|
+
cleanupTasks.push({ name: '技能进化', task: this.cleanup.evolveSkills() });
|
|
77
|
+
if (this.stopCount % 5 === 0) {
|
|
78
|
+
cleanupTasks.push({ name: '项目技能学习', task: this.cleanup.learnFromProject(event) });
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
skipped.push(`项目技能学习(每5次)`);
|
|
82
|
+
}
|
|
83
|
+
cleanupTasks.push({ name: '画像更新', task: this.cleanup.updateProfile() });
|
|
84
|
+
if (this.stopCount % 10 === 0) {
|
|
85
|
+
cleanupTasks.push({ name: '画像进化', task: this.cleanup.evolveProfile() });
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
skipped.push(`画像进化(每10次)`);
|
|
89
|
+
}
|
|
90
|
+
const taskNames = cleanupTasks.map(t => t.name).join('、');
|
|
91
|
+
logger.info(`启动 ${cleanupTasks.length} 个清理任务:${taskNames}`);
|
|
92
|
+
if (skipped.length > 0) {
|
|
93
|
+
logger.info(`跳过 ${skipped.length} 个周期任务:${skipped.join('、')}`);
|
|
94
|
+
}
|
|
95
|
+
const results = await Promise.allSettled(cleanupTasks.map(t => t.task));
|
|
96
|
+
const failed = results
|
|
97
|
+
.map((r, i) => r.status === 'rejected' ? cleanupTasks[i].name : null)
|
|
98
|
+
.filter(Boolean);
|
|
81
99
|
if (failed.length > 0) {
|
|
82
|
-
logger.warn(
|
|
100
|
+
logger.warn(`${failed.length} 个清理任务失败:${failed.join('、')}`);
|
|
83
101
|
}
|
|
84
102
|
else {
|
|
85
|
-
logger.info(
|
|
103
|
+
logger.info(`全部 ${results.length} 个清理任务完成`);
|
|
86
104
|
}
|
|
87
105
|
}
|
|
88
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-handler.js","sourceRoot":"","sources":["../../../src/daemon/handlers/stop-handler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,OAAO,WAAY,SAAQ,eAAe;IAC7B,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,OAAO,CAAwB;IACxC,SAAS,GAAG,CAAC,CAAC;IAEtB,YAAY,GAAmB;QAC7B,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAiB;QAC5B,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAChE,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,MAAM,CAAC,IAAI,CAAC
|
|
1
|
+
{"version":3,"file":"stop-handler.js","sourceRoot":"","sources":["../../../src/daemon/handlers/stop-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,6 +58,10 @@ export declare class UserPromptHandler extends BaseHookHandler {
|
|
|
58
58
|
private handleComplexTask;
|
|
59
59
|
private autoStartPipeline;
|
|
60
60
|
private promptPipelineChoice;
|
|
61
|
+
/**
|
|
62
|
+
* 简单任务的轻量注入:只注入规范和画像,不生成执行卡片和阶段计划。
|
|
63
|
+
*/
|
|
64
|
+
private buildLightweightResponse;
|
|
61
65
|
private buildSimpleResponse;
|
|
62
66
|
/**
|
|
63
67
|
* 读取项目决策历史(最近 800 字符),注入到会话上下文。
|
|
@@ -73,5 +77,10 @@ export declare class UserPromptHandler extends BaseHookHandler {
|
|
|
73
77
|
* 处理用户对 Pipeline 选择的回复(A/B/C)
|
|
74
78
|
*/
|
|
75
79
|
private startPipelineFromChoice;
|
|
80
|
+
/**
|
|
81
|
+
* 根据用户需求关键词推断当前最匹配的 Convention 角色。
|
|
82
|
+
* 纯关键词匹配,不调用 AI,用于日志展示。
|
|
83
|
+
*/
|
|
84
|
+
private inferCurrentRole;
|
|
76
85
|
}
|
|
77
86
|
//# sourceMappingURL=user-prompt-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-prompt-handler.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"user-prompt-handler.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAmBpD,qBAAa,iBAAkB,SAAQ,eAAe;IACpD;;;OAGG;IACH,OAAO,CAAC,iBAAiB,CAA8B;IACvD;;;OAGG;IACH,OAAO,CAAC,cAAc,CAA6B;IACnD;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAqC;IAE3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAO;IACnD,iCAAiC;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IAE1D,OAAO,CAAC,aAAa,CAA8B;gBAEvC,GAAG,EAAE,cAAc;IAK/B,4DAA4D;IAC5D,OAAO,CAAC,oBAAoB,CAAqB;IACjD,6CAA6C;IAC7C,OAAO,CAAC,cAAc,CAA6B;IAE7C,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAyF7D;;;OAGG;YACW,mBAAmB;IAwBjC,6BAA6B;IAC7B,OAAO,CAAC,aAAa;IAYrB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAqDhC,8CAA8C;IAC9C,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,WAAW;IASnB;;;OAGG;YACW,kBAAkB;IA8ChC,OAAO,CAAC,kBAAkB;IAW1B,+DAA+D;YACjD,iBAAiB;YA4BjB,iBAAiB;IA+C/B,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;YAwBlB,mBAAmB;IA6CjC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAoC5B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;YACW,uBAAuB;IA2BrC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CA6CzB"}
|
|
@@ -42,9 +42,9 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
42
42
|
// 0. 检测项目是否已初始化,未初始化时提示用户(每个 session 只提示一次)
|
|
43
43
|
const sessionKey = `${event.session_id}:${event.project_path}`;
|
|
44
44
|
if (!this.initPromptedSessions.has(sessionKey) && !isForgeManaged(event.project_path)) {
|
|
45
|
+
logger.info(`项目未初始化,已注入配置引导提示`);
|
|
45
46
|
this.initPromptedSessions.add(sessionKey);
|
|
46
47
|
this.initPromptedAt.set(sessionKey, Date.now());
|
|
47
|
-
logger.info(`[Forge:初始化] 项目未初始化,注入引导提示:${event.project_path}`);
|
|
48
48
|
return {
|
|
49
49
|
allow: true,
|
|
50
50
|
additionalContext: ForgeFormatter.wrapInQuote(`[Claude Forge 提示]\n当前项目(${event.project_path})尚未加入 Claude Forge 管理。\n请询问用户:"是否将当前项目加入 Claude Forge 管理?(将自动分析技术栈并生成项目规范)(是/否)"\n如果用户确认,请执行:\`\`\`bash\nmkdir -p "${event.project_path}/.claude-forge" && cd "${event.project_path}" && cf convention distill\n\`\`\`\n执行完成后告知用户项目已加入管理并生成了自定义规范。`),
|
|
@@ -54,12 +54,12 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
54
54
|
// 0. 对话式配置意图检测(pattern-based,不依赖 AI,优先执行)
|
|
55
55
|
const configMsg = await this.configHandler.handle(userPrompt, event.project_path);
|
|
56
56
|
if (configMsg) {
|
|
57
|
-
logger.info('
|
|
57
|
+
logger.info('检测到配置意图,已执行并注入确认消息');
|
|
58
58
|
// 注入确认消息后继续让 Claude 处理原始消息
|
|
59
59
|
return { allow: true, additionalContext: ForgeFormatter.wrapInQuote(configMsg) };
|
|
60
60
|
}
|
|
61
61
|
if (!intentEngine) {
|
|
62
|
-
logger.info('
|
|
62
|
+
logger.info('AI 引擎不可用,跳过意图分析');
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
65
|
// 1. 检查是否是对 Pipeline 选择的回复(优先处理)
|
|
@@ -82,25 +82,29 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
82
82
|
return patternResponse;
|
|
83
83
|
// 4. 干预级别
|
|
84
84
|
const interventionLevel = this.ctx.profileManager.getInterventionLevel(analysis.complexity);
|
|
85
|
-
logger.info(
|
|
86
|
-
if (interventionLevel === 'silent'
|
|
87
|
-
logger.info(
|
|
85
|
+
logger.info(`用户偏好介入程度:${interventionLevel}(任务复杂度:${analysis.complexity})`);
|
|
86
|
+
if (interventionLevel === 'silent') {
|
|
87
|
+
logger.info(`用户偏好静默模式,跳过编排`);
|
|
88
88
|
return;
|
|
89
89
|
}
|
|
90
|
-
// 5.
|
|
90
|
+
// 5. 简单任务:轻量注入(只注入规范和画像,跳过执行卡片和 Pipeline)
|
|
91
|
+
if (analysis.complexity === 'simple') {
|
|
92
|
+
return this.buildLightweightResponse(analysis, event.project_path);
|
|
93
|
+
}
|
|
94
|
+
// 6. 执行路径卡片(moderate/complex)
|
|
91
95
|
const card = this.buildExecutionCard(analysis);
|
|
92
|
-
//
|
|
96
|
+
// 7. 复杂任务 Pipeline 决策
|
|
93
97
|
if (analysis.requiresPipeline) {
|
|
94
98
|
const pipelineResponse = await this.handleComplexTask(analysis, card, event, interventionLevel);
|
|
95
99
|
if (pipelineResponse !== undefined)
|
|
96
100
|
return pipelineResponse;
|
|
97
101
|
}
|
|
98
|
-
//
|
|
102
|
+
// 8. 中等任务:知识搜索 + 指令注入
|
|
99
103
|
const response = await this.buildSimpleResponse(analysis, card, event.project_path);
|
|
100
104
|
return response;
|
|
101
105
|
}
|
|
102
106
|
catch (err) {
|
|
103
|
-
logger.error(
|
|
107
|
+
logger.error(`意图分析失败:${err}`);
|
|
104
108
|
}
|
|
105
109
|
}
|
|
106
110
|
// ── 私有方法 ──────────────────────────────────────────────────────────────
|
|
@@ -115,13 +119,13 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
115
119
|
const choice = parsePipelineChoice(userPrompt);
|
|
116
120
|
if (choice) {
|
|
117
121
|
this.setSuggestionPending(event.project_path, false);
|
|
118
|
-
logger.info(
|
|
122
|
+
logger.info(`用户选择了工作流方案:${choice}`);
|
|
119
123
|
profileManager.recordBehavior({ type: 'accept', context: `pipeline:${choice}`, timestamp: new Date().toISOString() });
|
|
120
124
|
return this.startPipelineFromChoice(choice, event);
|
|
121
125
|
}
|
|
122
126
|
if (this.suggestionPending.get(event.project_path)) {
|
|
123
127
|
this.setSuggestionPending(event.project_path, false);
|
|
124
|
-
logger.info('
|
|
128
|
+
logger.info('用户忽略了工作流建议');
|
|
125
129
|
profileManager.recordBehavior({ type: 'skip', context: 'pipeline:ignored', timestamp: new Date().toISOString() });
|
|
126
130
|
}
|
|
127
131
|
return undefined;
|
|
@@ -132,7 +136,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
132
136
|
this.evictStaleEntries(now);
|
|
133
137
|
const lastAt = this.lastAnalysisAt.get(projectPath) ?? 0;
|
|
134
138
|
if (now - lastAt < UserPromptHandler.ANALYSIS_COOLDOWN_MS) {
|
|
135
|
-
logger.info(
|
|
139
|
+
logger.info(`分析冷却中,跳过(${projectPath})`);
|
|
136
140
|
return false;
|
|
137
141
|
}
|
|
138
142
|
this.lastAnalysisAt.set(projectPath, now);
|
|
@@ -229,14 +233,14 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
229
233
|
...(cache ?? { decisionsKey: '', decisionsResult: '' }),
|
|
230
234
|
profileInjected: true,
|
|
231
235
|
});
|
|
232
|
-
logger.info(
|
|
236
|
+
logger.info(`注入用户画像:角色=${profile.role} 经验=${profile.experience_level} 风格=${profile.work_style}`);
|
|
233
237
|
return ForgeFormatter.formatProfileContext(profile);
|
|
234
238
|
}
|
|
235
239
|
logAnalysis(analysis) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
logger.info(
|
|
240
|
+
const pipelineStr = analysis.requiresPipeline ? '需要多步骤编排' : '直接执行';
|
|
241
|
+
logger.info(`意图分析:${analysis.complexity} | ${pipelineStr} | ` +
|
|
242
|
+
`预估文件=${analysis.estimatedFiles} | 需求="${analysis.requirement}"`);
|
|
243
|
+
logger.info(`分析理由:${analysis.reasoning}`);
|
|
240
244
|
}
|
|
241
245
|
/**
|
|
242
246
|
* Pattern 路由:若命中 Pattern,注入结构化执行指令并返回 HookResponse。
|
|
@@ -251,7 +255,10 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
251
255
|
const activeConventions = this.ctx.conventionManager.getActiveConventions(event.project_path);
|
|
252
256
|
const patternCtx = await patternEngine.routeAndStart(userPrompt, event.session_id, event.project_path, complexity, activeConventions);
|
|
253
257
|
if (!patternCtx) {
|
|
254
|
-
|
|
258
|
+
// 未匹配到 Pattern,走常规路径,但仍推断当前角色
|
|
259
|
+
const inferredRole = this.inferCurrentRole(analysis.requirement, activeConventions);
|
|
260
|
+
const roleInfo = inferredRole ? ` | 当前角色=${inferredRole.name}` : '';
|
|
261
|
+
logger.info(`未匹配到工作流模板,走常规路径${roleInfo}`);
|
|
255
262
|
return undefined;
|
|
256
263
|
}
|
|
257
264
|
const plan = patternEngine.getActivePlan(event.project_path);
|
|
@@ -262,7 +269,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
262
269
|
const ctx = patternEngine.buildAdditionalContext(patternCtx, plan.patternId, primaryConvention);
|
|
263
270
|
if (!ctx)
|
|
264
271
|
return undefined;
|
|
265
|
-
logger.info(
|
|
272
|
+
logger.info(`匹配到工作流模板:${patternCtx.patternName} — 当前阶段:${patternCtx.currentPhaseId}`);
|
|
266
273
|
// 执行路径卡片通过 systemMessage 展示给用户,Pattern 指令通过 additionalContext 传给 Claude
|
|
267
274
|
const card = this.buildExecutionCard(analysis);
|
|
268
275
|
const profileCtx = this.buildProfileContext(event.project_path);
|
|
@@ -270,7 +277,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
270
277
|
return { allow: true, systemMessage: card, additionalContext: ForgeFormatter.wrapInQuote(combinedCtx) };
|
|
271
278
|
}
|
|
272
279
|
catch (err) {
|
|
273
|
-
logger.warn(
|
|
280
|
+
logger.warn(`工作流路由失败,降级到技能编排:${err}`);
|
|
274
281
|
return undefined;
|
|
275
282
|
}
|
|
276
283
|
}
|
|
@@ -290,7 +297,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
290
297
|
if (!pipelineEngine || !config.autopilot.auto_start_pipeline)
|
|
291
298
|
return undefined;
|
|
292
299
|
if (pipelineEngine.hasActivePipeline(event.project_path)) {
|
|
293
|
-
logger.info('
|
|
300
|
+
logger.info('已有活跃的编排流程');
|
|
294
301
|
return undefined;
|
|
295
302
|
}
|
|
296
303
|
const confirmMode = config.autopilot.pipeline_confirm_mode;
|
|
@@ -301,7 +308,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
301
308
|
return this.promptPipelineChoice(analysis, card, event);
|
|
302
309
|
}
|
|
303
310
|
// preview 模式:仅展示,不启动
|
|
304
|
-
logger.info('
|
|
311
|
+
logger.info('预览模式,不启动编排流程');
|
|
305
312
|
return undefined;
|
|
306
313
|
}
|
|
307
314
|
async autoStartPipeline(analysis, card, event, qualityGate) {
|
|
@@ -314,7 +321,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
314
321
|
const activeConventions = this.ctx.conventionManager.getActiveConventions(event.project_path);
|
|
315
322
|
const conventionPrompt = this.ctx.conventionManager.getActivePrompt(event.project_path) ?? undefined;
|
|
316
323
|
if (activeConventions.length > 0) {
|
|
317
|
-
logger.info(
|
|
324
|
+
logger.info(`已加载项目规范:${ForgeFormatter.formatConventionSummary(activeConventions)}`);
|
|
318
325
|
}
|
|
319
326
|
const context = ForgeFormatter.wrapInQuote(this.budgetContext({ content: this.buildProfileContext(event.project_path), priority: -1 }, { content: conventionPrompt, priority: 0 }, { content: autoMsg, priority: 1 }, { content: this.readDecisionsContext(analysis.requirement, event.project_path), priority: 2 }));
|
|
320
327
|
if (analysis.clarifyQuestions?.length) {
|
|
@@ -326,7 +333,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
326
333
|
const pipelineInjected = ['Pipeline指令'];
|
|
327
334
|
if (conventionPrompt)
|
|
328
335
|
pipelineInjected.push(`规范(${activeConventions.map(c => c.id).join(',')})`);
|
|
329
|
-
logger.info(
|
|
336
|
+
logger.info(`自动启动多步骤编排 | 任务数=${pipeline.tasks.length} | 注入=[${pipelineInjected.join(', ')}]`);
|
|
330
337
|
return { allow: true, systemMessage: card, additionalContext: context };
|
|
331
338
|
}
|
|
332
339
|
promptPipelineChoice(analysis, card, event) {
|
|
@@ -334,12 +341,33 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
334
341
|
this.setSuggestionPending(event.project_path, true);
|
|
335
342
|
if (analysis.clarifyQuestions?.length) {
|
|
336
343
|
const clarify = ForgeFormatter.formatClarifyRequest(analysis.clarifyQuestions);
|
|
337
|
-
logger.info('
|
|
344
|
+
logger.info('向用户展示澄清问题 + 编排方案选项');
|
|
338
345
|
return { allow: true, systemMessage: card, additionalContext: ForgeFormatter.mergeContexts(ForgeFormatter.wrapInQuote(options), clarify) };
|
|
339
346
|
}
|
|
340
|
-
logger.info('
|
|
347
|
+
logger.info('向用户展示编排方案选项');
|
|
341
348
|
return { allow: true, systemMessage: card, additionalContext: ForgeFormatter.wrapInQuote(options) };
|
|
342
349
|
}
|
|
350
|
+
/**
|
|
351
|
+
* 简单任务的轻量注入:只注入规范和画像,不生成执行卡片和阶段计划。
|
|
352
|
+
*/
|
|
353
|
+
buildLightweightResponse(analysis, projectPath) {
|
|
354
|
+
const activeConventions = this.ctx.conventionManager.getActiveConventions(projectPath);
|
|
355
|
+
const conventionPrompt = this.ctx.conventionManager.getActivePrompt(projectPath) ?? undefined;
|
|
356
|
+
if (activeConventions.length > 0) {
|
|
357
|
+
logger.info(`[轻量注入] 规范:${ForgeFormatter.formatConventionSummary(activeConventions)}`);
|
|
358
|
+
}
|
|
359
|
+
const body = this.budgetContext({ content: this.buildProfileContext(projectPath), priority: -1 }, { content: conventionPrompt, priority: 0 });
|
|
360
|
+
const injected = [];
|
|
361
|
+
if (this.injectionCache.get(projectPath)?.profileInjected)
|
|
362
|
+
injected.push('画像');
|
|
363
|
+
if (conventionPrompt)
|
|
364
|
+
injected.push(`规范(${activeConventions.map(c => c.id).join(',')})`);
|
|
365
|
+
logger.info(`处理完成:轻量注入 | 复杂度=simple | 注入=[${injected.join(', ') || '无'}]`);
|
|
366
|
+
return {
|
|
367
|
+
allow: true,
|
|
368
|
+
additionalContext: body ? ForgeFormatter.wrapInQuote(body) : undefined,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
343
371
|
async buildSimpleResponse(analysis, card, projectPath) {
|
|
344
372
|
const directive = this.ctx.intentEngine.generateDirective(analysis);
|
|
345
373
|
const decisionsContext = this.readDecisionsContext(analysis.requirement, projectPath);
|
|
@@ -347,11 +375,11 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
347
375
|
const activeConventions = this.ctx.conventionManager.getActiveConventions(projectPath);
|
|
348
376
|
const conventionPrompt = this.ctx.conventionManager.getActivePrompt(projectPath) ?? undefined;
|
|
349
377
|
if (activeConventions.length > 0) {
|
|
350
|
-
logger.info(
|
|
378
|
+
logger.info(`已加载项目规范:${ForgeFormatter.formatConventionSummary(activeConventions)}`);
|
|
351
379
|
}
|
|
352
380
|
if (analysis.clarifyQuestions?.length) {
|
|
353
381
|
const clarify = ForgeFormatter.formatClarifyRequest(analysis.clarifyQuestions);
|
|
354
|
-
logger.info(
|
|
382
|
+
logger.info(`注入澄清问题 ${analysis.clarifyQuestions.length} 个`);
|
|
355
383
|
return {
|
|
356
384
|
allow: true,
|
|
357
385
|
systemMessage: card,
|
|
@@ -369,7 +397,9 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
369
397
|
injected.push('执行指令');
|
|
370
398
|
if (decisionsContext)
|
|
371
399
|
injected.push('决策历史');
|
|
372
|
-
|
|
400
|
+
const inferredRole = this.inferCurrentRole(analysis.requirement, activeConventions);
|
|
401
|
+
const roleStr = inferredRole ? ` | 当前角色=${inferredRole.name}` : '';
|
|
402
|
+
logger.info(`处理完成:直接执行 | 复杂度=${analysis.complexity}${roleStr} | 注入=[${injected.join(', ') || '无'}]`);
|
|
373
403
|
return {
|
|
374
404
|
allow: true,
|
|
375
405
|
systemMessage: card,
|
|
@@ -395,7 +425,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
395
425
|
const fingerprint = content.slice(0, 64);
|
|
396
426
|
const cache = this.injectionCache.get(projectPath);
|
|
397
427
|
if (cache?.decisionsKey === fingerprint) {
|
|
398
|
-
logger.info('
|
|
428
|
+
logger.info('决策历史内容未变,跳过重复注入');
|
|
399
429
|
return undefined;
|
|
400
430
|
}
|
|
401
431
|
const result = ForgeFormatter.formatModuleNotification('decisions', `项目决策历史(供参考):\n\`\`\`\n${recent}\n\`\`\``);
|
|
@@ -423,7 +453,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
423
453
|
const used = selected.reduce((sum, c) => sum + c.length, 0);
|
|
424
454
|
if (selected.length === 0)
|
|
425
455
|
return '';
|
|
426
|
-
logger.info(
|
|
456
|
+
logger.info(`注入上下文 ${used} 字符,共 ${selected.length} 块`);
|
|
427
457
|
return ForgeFormatter.mergeContexts(...selected);
|
|
428
458
|
}
|
|
429
459
|
/**
|
|
@@ -433,16 +463,59 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
433
463
|
const option = PIPELINE_OPTIONS[choice];
|
|
434
464
|
if (choice === 'manual') {
|
|
435
465
|
const msg = ForgeFormatter.formatModuleNotification('pipeline', '已切换到手动控制模式,请逐步告诉我你的需求');
|
|
436
|
-
logger.info('
|
|
466
|
+
logger.info('用户选择了手动模式');
|
|
437
467
|
return { allow: true, additionalContext: ForgeFormatter.wrapInQuote(msg) };
|
|
438
468
|
}
|
|
439
469
|
const requirement = event.tool_input?.user_prompt || '用户需求';
|
|
440
470
|
const pipeline = await this.ctx.pipelineEngine.startPipeline(requirement, event.project_path, event.session_id);
|
|
441
471
|
if (this.ctx.qualityGate)
|
|
442
472
|
this.ctx.qualityGate.setRequirement(requirement);
|
|
443
|
-
logger.info(
|
|
473
|
+
logger.info(`已启动编排(${option.description}):id=${pipeline.id} | 任务数=${pipeline.tasks.length}`);
|
|
444
474
|
const msg = ForgeFormatter.formatModuleNotification('pipeline', `已启动${option.description},共 ${pipeline.tasks.length} 个任务\n阶段:${option.phases.join(' → ')}`);
|
|
445
475
|
return { allow: true, additionalContext: ForgeFormatter.wrapInQuote(msg) };
|
|
446
476
|
}
|
|
477
|
+
/**
|
|
478
|
+
* 根据用户需求关键词推断当前最匹配的 Convention 角色。
|
|
479
|
+
* 纯关键词匹配,不调用 AI,用于日志展示。
|
|
480
|
+
*/
|
|
481
|
+
inferCurrentRole(requirement, conventions) {
|
|
482
|
+
const input = requirement.toLowerCase();
|
|
483
|
+
// 角色关键词映射(按优先级排序,先匹配先返回)
|
|
484
|
+
const roleKeywords = [
|
|
485
|
+
// 需求/产品阶段
|
|
486
|
+
{ keywords: ['需求', '用户故事', '产品', '规格', '验收', 'spec', 'requirement'], roleKeys: ['product_manager'] },
|
|
487
|
+
// 架构/设计阶段
|
|
488
|
+
{ keywords: ['架构', '设计', '方案', '技术选型', 'api', '数据模型', 'schema'], roleKeys: ['architect'] },
|
|
489
|
+
// 测试/安全网阶段
|
|
490
|
+
{ keywords: ['测试', '覆盖', '安全网', 'test', '特征测试', '边界'], roleKeys: ['safety_net_engineer', 'verification_engineer'] },
|
|
491
|
+
// 审查阶段
|
|
492
|
+
{ keywords: ['审查', 'review', '代码审查', '检查', '质量'], roleKeys: ['tech_lead', 'verification_engineer'] },
|
|
493
|
+
// 理解/分析阶段
|
|
494
|
+
{ keywords: ['理解', '分析', '阅读', '调查', '排查', '诊断', 'debug'], roleKeys: ['code_archaeologist'] },
|
|
495
|
+
// 编码/实现阶段(最宽泛,放最后)
|
|
496
|
+
{ keywords: ['实现', '编码', '开发', '修复', '重构', '优化', '改', '加', '写', 'fix', 'implement', 'refactor'], roleKeys: ['developer', 'surgeon'] },
|
|
497
|
+
];
|
|
498
|
+
// 收集所有 Convention 的角色
|
|
499
|
+
const allRoles = new Map();
|
|
500
|
+
for (const conv of conventions) {
|
|
501
|
+
for (const [key, role] of Object.entries(conv.roles ?? {})) {
|
|
502
|
+
allRoles.set(key, role);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
if (allRoles.size === 0)
|
|
506
|
+
return null;
|
|
507
|
+
// 按关键词匹配
|
|
508
|
+
for (const { keywords, roleKeys } of roleKeywords) {
|
|
509
|
+
if (keywords.some(kw => input.includes(kw))) {
|
|
510
|
+
for (const rk of roleKeys) {
|
|
511
|
+
const role = allRoles.get(rk);
|
|
512
|
+
if (role)
|
|
513
|
+
return role;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
// 默认返回开发工程师(最常见的角色)
|
|
518
|
+
return allRoles.get('developer') ?? allRoles.get('surgeon') ?? null;
|
|
519
|
+
}
|
|
447
520
|
}
|
|
448
521
|
//# sourceMappingURL=user-prompt-handler.js.map
|