@winspan/claude-forge 0.2.9 → 0.2.10
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 +5 -0
- package/dist/daemon/handlers/user-prompt-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt-handler.js +78 -30
- package/dist/daemon/handlers/user-prompt-handler.js.map +1 -1
- package/dist/daemon/index.js +2 -2
- package/dist/daemon/index.js.map +1 -1
- 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 +5 -3
- package/dist/skill-registry/orchestrator.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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"}
|
|
@@ -73,5 +73,10 @@ export declare class UserPromptHandler extends BaseHookHandler {
|
|
|
73
73
|
* 处理用户对 Pipeline 选择的回复(A/B/C)
|
|
74
74
|
*/
|
|
75
75
|
private startPipelineFromChoice;
|
|
76
|
+
/**
|
|
77
|
+
* 根据用户需求关键词推断当前最匹配的 Convention 角色。
|
|
78
|
+
* 纯关键词匹配,不调用 AI,用于日志展示。
|
|
79
|
+
*/
|
|
80
|
+
private inferCurrentRole;
|
|
76
81
|
}
|
|
77
82
|
//# 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;IAoF7D;;;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;YAkBd,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,9 +82,9 @@ 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(
|
|
85
|
+
logger.info(`用户偏好介入程度:${interventionLevel}(任务复杂度:${analysis.complexity})`);
|
|
86
86
|
if (interventionLevel === 'silent' || analysis.complexity === 'simple') {
|
|
87
|
-
logger.info(
|
|
87
|
+
logger.info(`简单任务,跳过编排(规范仍生效)`);
|
|
88
88
|
return;
|
|
89
89
|
}
|
|
90
90
|
// 5. 执行路径卡片
|
|
@@ -100,7 +100,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
100
100
|
return response;
|
|
101
101
|
}
|
|
102
102
|
catch (err) {
|
|
103
|
-
logger.error(
|
|
103
|
+
logger.error(`意图分析失败:${err}`);
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
// ── 私有方法 ──────────────────────────────────────────────────────────────
|
|
@@ -115,13 +115,13 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
115
115
|
const choice = parsePipelineChoice(userPrompt);
|
|
116
116
|
if (choice) {
|
|
117
117
|
this.setSuggestionPending(event.project_path, false);
|
|
118
|
-
logger.info(
|
|
118
|
+
logger.info(`用户选择了工作流方案:${choice}`);
|
|
119
119
|
profileManager.recordBehavior({ type: 'accept', context: `pipeline:${choice}`, timestamp: new Date().toISOString() });
|
|
120
120
|
return this.startPipelineFromChoice(choice, event);
|
|
121
121
|
}
|
|
122
122
|
if (this.suggestionPending.get(event.project_path)) {
|
|
123
123
|
this.setSuggestionPending(event.project_path, false);
|
|
124
|
-
logger.info('
|
|
124
|
+
logger.info('用户忽略了工作流建议');
|
|
125
125
|
profileManager.recordBehavior({ type: 'skip', context: 'pipeline:ignored', timestamp: new Date().toISOString() });
|
|
126
126
|
}
|
|
127
127
|
return undefined;
|
|
@@ -132,7 +132,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
132
132
|
this.evictStaleEntries(now);
|
|
133
133
|
const lastAt = this.lastAnalysisAt.get(projectPath) ?? 0;
|
|
134
134
|
if (now - lastAt < UserPromptHandler.ANALYSIS_COOLDOWN_MS) {
|
|
135
|
-
logger.info(
|
|
135
|
+
logger.info(`分析冷却中,跳过(${projectPath})`);
|
|
136
136
|
return false;
|
|
137
137
|
}
|
|
138
138
|
this.lastAnalysisAt.set(projectPath, now);
|
|
@@ -229,14 +229,14 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
229
229
|
...(cache ?? { decisionsKey: '', decisionsResult: '' }),
|
|
230
230
|
profileInjected: true,
|
|
231
231
|
});
|
|
232
|
-
logger.info(
|
|
232
|
+
logger.info(`注入用户画像:角色=${profile.role} 经验=${profile.experience_level} 风格=${profile.work_style}`);
|
|
233
233
|
return ForgeFormatter.formatProfileContext(profile);
|
|
234
234
|
}
|
|
235
235
|
logAnalysis(analysis) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
logger.info(
|
|
236
|
+
const pipelineStr = analysis.requiresPipeline ? '需要多步骤编排' : '直接执行';
|
|
237
|
+
logger.info(`意图分析:${analysis.complexity} | ${pipelineStr} | ` +
|
|
238
|
+
`预估文件=${analysis.estimatedFiles} | 需求="${analysis.requirement}"`);
|
|
239
|
+
logger.info(`分析理由:${analysis.reasoning}`);
|
|
240
240
|
}
|
|
241
241
|
/**
|
|
242
242
|
* Pattern 路由:若命中 Pattern,注入结构化执行指令并返回 HookResponse。
|
|
@@ -251,7 +251,10 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
251
251
|
const activeConventions = this.ctx.conventionManager.getActiveConventions(event.project_path);
|
|
252
252
|
const patternCtx = await patternEngine.routeAndStart(userPrompt, event.session_id, event.project_path, complexity, activeConventions);
|
|
253
253
|
if (!patternCtx) {
|
|
254
|
-
|
|
254
|
+
// 未匹配到 Pattern,走常规路径,但仍推断当前角色
|
|
255
|
+
const inferredRole = this.inferCurrentRole(analysis.requirement, activeConventions);
|
|
256
|
+
const roleInfo = inferredRole ? ` | 当前角色=${inferredRole.name}` : '';
|
|
257
|
+
logger.info(`未匹配到工作流模板,走常规路径${roleInfo}`);
|
|
255
258
|
return undefined;
|
|
256
259
|
}
|
|
257
260
|
const plan = patternEngine.getActivePlan(event.project_path);
|
|
@@ -262,7 +265,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
262
265
|
const ctx = patternEngine.buildAdditionalContext(patternCtx, plan.patternId, primaryConvention);
|
|
263
266
|
if (!ctx)
|
|
264
267
|
return undefined;
|
|
265
|
-
logger.info(
|
|
268
|
+
logger.info(`匹配到工作流模板:${patternCtx.patternName} — 当前阶段:${patternCtx.currentPhaseId}`);
|
|
266
269
|
// 执行路径卡片通过 systemMessage 展示给用户,Pattern 指令通过 additionalContext 传给 Claude
|
|
267
270
|
const card = this.buildExecutionCard(analysis);
|
|
268
271
|
const profileCtx = this.buildProfileContext(event.project_path);
|
|
@@ -270,7 +273,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
270
273
|
return { allow: true, systemMessage: card, additionalContext: ForgeFormatter.wrapInQuote(combinedCtx) };
|
|
271
274
|
}
|
|
272
275
|
catch (err) {
|
|
273
|
-
logger.warn(
|
|
276
|
+
logger.warn(`工作流路由失败,降级到技能编排:${err}`);
|
|
274
277
|
return undefined;
|
|
275
278
|
}
|
|
276
279
|
}
|
|
@@ -290,7 +293,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
290
293
|
if (!pipelineEngine || !config.autopilot.auto_start_pipeline)
|
|
291
294
|
return undefined;
|
|
292
295
|
if (pipelineEngine.hasActivePipeline(event.project_path)) {
|
|
293
|
-
logger.info('
|
|
296
|
+
logger.info('已有活跃的编排流程');
|
|
294
297
|
return undefined;
|
|
295
298
|
}
|
|
296
299
|
const confirmMode = config.autopilot.pipeline_confirm_mode;
|
|
@@ -301,7 +304,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
301
304
|
return this.promptPipelineChoice(analysis, card, event);
|
|
302
305
|
}
|
|
303
306
|
// preview 模式:仅展示,不启动
|
|
304
|
-
logger.info('
|
|
307
|
+
logger.info('预览模式,不启动编排流程');
|
|
305
308
|
return undefined;
|
|
306
309
|
}
|
|
307
310
|
async autoStartPipeline(analysis, card, event, qualityGate) {
|
|
@@ -314,7 +317,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
314
317
|
const activeConventions = this.ctx.conventionManager.getActiveConventions(event.project_path);
|
|
315
318
|
const conventionPrompt = this.ctx.conventionManager.getActivePrompt(event.project_path) ?? undefined;
|
|
316
319
|
if (activeConventions.length > 0) {
|
|
317
|
-
logger.info(
|
|
320
|
+
logger.info(`已加载项目规范:${ForgeFormatter.formatConventionSummary(activeConventions)}`);
|
|
318
321
|
}
|
|
319
322
|
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
323
|
if (analysis.clarifyQuestions?.length) {
|
|
@@ -326,7 +329,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
326
329
|
const pipelineInjected = ['Pipeline指令'];
|
|
327
330
|
if (conventionPrompt)
|
|
328
331
|
pipelineInjected.push(`规范(${activeConventions.map(c => c.id).join(',')})`);
|
|
329
|
-
logger.info(
|
|
332
|
+
logger.info(`自动启动多步骤编排 | 任务数=${pipeline.tasks.length} | 注入=[${pipelineInjected.join(', ')}]`);
|
|
330
333
|
return { allow: true, systemMessage: card, additionalContext: context };
|
|
331
334
|
}
|
|
332
335
|
promptPipelineChoice(analysis, card, event) {
|
|
@@ -334,10 +337,10 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
334
337
|
this.setSuggestionPending(event.project_path, true);
|
|
335
338
|
if (analysis.clarifyQuestions?.length) {
|
|
336
339
|
const clarify = ForgeFormatter.formatClarifyRequest(analysis.clarifyQuestions);
|
|
337
|
-
logger.info('
|
|
340
|
+
logger.info('向用户展示澄清问题 + 编排方案选项');
|
|
338
341
|
return { allow: true, systemMessage: card, additionalContext: ForgeFormatter.mergeContexts(ForgeFormatter.wrapInQuote(options), clarify) };
|
|
339
342
|
}
|
|
340
|
-
logger.info('
|
|
343
|
+
logger.info('向用户展示编排方案选项');
|
|
341
344
|
return { allow: true, systemMessage: card, additionalContext: ForgeFormatter.wrapInQuote(options) };
|
|
342
345
|
}
|
|
343
346
|
async buildSimpleResponse(analysis, card, projectPath) {
|
|
@@ -347,11 +350,11 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
347
350
|
const activeConventions = this.ctx.conventionManager.getActiveConventions(projectPath);
|
|
348
351
|
const conventionPrompt = this.ctx.conventionManager.getActivePrompt(projectPath) ?? undefined;
|
|
349
352
|
if (activeConventions.length > 0) {
|
|
350
|
-
logger.info(
|
|
353
|
+
logger.info(`已加载项目规范:${ForgeFormatter.formatConventionSummary(activeConventions)}`);
|
|
351
354
|
}
|
|
352
355
|
if (analysis.clarifyQuestions?.length) {
|
|
353
356
|
const clarify = ForgeFormatter.formatClarifyRequest(analysis.clarifyQuestions);
|
|
354
|
-
logger.info(
|
|
357
|
+
logger.info(`注入澄清问题 ${analysis.clarifyQuestions.length} 个`);
|
|
355
358
|
return {
|
|
356
359
|
allow: true,
|
|
357
360
|
systemMessage: card,
|
|
@@ -369,7 +372,9 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
369
372
|
injected.push('执行指令');
|
|
370
373
|
if (decisionsContext)
|
|
371
374
|
injected.push('决策历史');
|
|
372
|
-
|
|
375
|
+
const inferredRole = this.inferCurrentRole(analysis.requirement, activeConventions);
|
|
376
|
+
const roleStr = inferredRole ? ` | 当前角色=${inferredRole.name}` : '';
|
|
377
|
+
logger.info(`处理完成:直接执行 | 复杂度=${analysis.complexity}${roleStr} | 注入=[${injected.join(', ') || '无'}]`);
|
|
373
378
|
return {
|
|
374
379
|
allow: true,
|
|
375
380
|
systemMessage: card,
|
|
@@ -395,7 +400,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
395
400
|
const fingerprint = content.slice(0, 64);
|
|
396
401
|
const cache = this.injectionCache.get(projectPath);
|
|
397
402
|
if (cache?.decisionsKey === fingerprint) {
|
|
398
|
-
logger.info('
|
|
403
|
+
logger.info('决策历史内容未变,跳过重复注入');
|
|
399
404
|
return undefined;
|
|
400
405
|
}
|
|
401
406
|
const result = ForgeFormatter.formatModuleNotification('decisions', `项目决策历史(供参考):\n\`\`\`\n${recent}\n\`\`\``);
|
|
@@ -423,7 +428,7 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
423
428
|
const used = selected.reduce((sum, c) => sum + c.length, 0);
|
|
424
429
|
if (selected.length === 0)
|
|
425
430
|
return '';
|
|
426
|
-
logger.info(
|
|
431
|
+
logger.info(`注入上下文 ${used} 字符,共 ${selected.length} 块`);
|
|
427
432
|
return ForgeFormatter.mergeContexts(...selected);
|
|
428
433
|
}
|
|
429
434
|
/**
|
|
@@ -433,16 +438,59 @@ export class UserPromptHandler extends BaseHookHandler {
|
|
|
433
438
|
const option = PIPELINE_OPTIONS[choice];
|
|
434
439
|
if (choice === 'manual') {
|
|
435
440
|
const msg = ForgeFormatter.formatModuleNotification('pipeline', '已切换到手动控制模式,请逐步告诉我你的需求');
|
|
436
|
-
logger.info('
|
|
441
|
+
logger.info('用户选择了手动模式');
|
|
437
442
|
return { allow: true, additionalContext: ForgeFormatter.wrapInQuote(msg) };
|
|
438
443
|
}
|
|
439
444
|
const requirement = event.tool_input?.user_prompt || '用户需求';
|
|
440
445
|
const pipeline = await this.ctx.pipelineEngine.startPipeline(requirement, event.project_path, event.session_id);
|
|
441
446
|
if (this.ctx.qualityGate)
|
|
442
447
|
this.ctx.qualityGate.setRequirement(requirement);
|
|
443
|
-
logger.info(
|
|
448
|
+
logger.info(`已启动编排(${option.description}):id=${pipeline.id} | 任务数=${pipeline.tasks.length}`);
|
|
444
449
|
const msg = ForgeFormatter.formatModuleNotification('pipeline', `已启动${option.description},共 ${pipeline.tasks.length} 个任务\n阶段:${option.phases.join(' → ')}`);
|
|
445
450
|
return { allow: true, additionalContext: ForgeFormatter.wrapInQuote(msg) };
|
|
446
451
|
}
|
|
452
|
+
/**
|
|
453
|
+
* 根据用户需求关键词推断当前最匹配的 Convention 角色。
|
|
454
|
+
* 纯关键词匹配,不调用 AI,用于日志展示。
|
|
455
|
+
*/
|
|
456
|
+
inferCurrentRole(requirement, conventions) {
|
|
457
|
+
const input = requirement.toLowerCase();
|
|
458
|
+
// 角色关键词映射(按优先级排序,先匹配先返回)
|
|
459
|
+
const roleKeywords = [
|
|
460
|
+
// 需求/产品阶段
|
|
461
|
+
{ keywords: ['需求', '用户故事', '产品', '规格', '验收', 'spec', 'requirement'], roleKeys: ['product_manager'] },
|
|
462
|
+
// 架构/设计阶段
|
|
463
|
+
{ keywords: ['架构', '设计', '方案', '技术选型', 'api', '数据模型', 'schema'], roleKeys: ['architect'] },
|
|
464
|
+
// 测试/安全网阶段
|
|
465
|
+
{ keywords: ['测试', '覆盖', '安全网', 'test', '特征测试', '边界'], roleKeys: ['safety_net_engineer', 'verification_engineer'] },
|
|
466
|
+
// 审查阶段
|
|
467
|
+
{ keywords: ['审查', 'review', '代码审查', '检查', '质量'], roleKeys: ['tech_lead', 'verification_engineer'] },
|
|
468
|
+
// 理解/分析阶段
|
|
469
|
+
{ keywords: ['理解', '分析', '阅读', '调查', '排查', '诊断', 'debug'], roleKeys: ['code_archaeologist'] },
|
|
470
|
+
// 编码/实现阶段(最宽泛,放最后)
|
|
471
|
+
{ keywords: ['实现', '编码', '开发', '修复', '重构', '优化', '改', '加', '写', 'fix', 'implement', 'refactor'], roleKeys: ['developer', 'surgeon'] },
|
|
472
|
+
];
|
|
473
|
+
// 收集所有 Convention 的角色
|
|
474
|
+
const allRoles = new Map();
|
|
475
|
+
for (const conv of conventions) {
|
|
476
|
+
for (const [key, role] of Object.entries(conv.roles ?? {})) {
|
|
477
|
+
allRoles.set(key, role);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (allRoles.size === 0)
|
|
481
|
+
return null;
|
|
482
|
+
// 按关键词匹配
|
|
483
|
+
for (const { keywords, roleKeys } of roleKeywords) {
|
|
484
|
+
if (keywords.some(kw => input.includes(kw))) {
|
|
485
|
+
for (const rk of roleKeys) {
|
|
486
|
+
const role = allRoles.get(rk);
|
|
487
|
+
if (role)
|
|
488
|
+
return role;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
// 默认返回开发工程师(最常见的角色)
|
|
493
|
+
return allRoles.get('developer') ?? allRoles.get('surgeon') ?? null;
|
|
494
|
+
}
|
|
447
495
|
}
|
|
448
496
|
//# sourceMappingURL=user-prompt-handler.js.map
|