feat: 更新钩子模板检查逻辑,支持基于唯一模式的命令匹配;在搜索元数据中添加回退模式字段

This commit is contained in:
catlog22
2025-12-22 10:25:53 +08:00
parent f3f2051c45
commit 17002345c9
3 changed files with 26 additions and 10 deletions

View File

@@ -138,14 +138,14 @@ const HOOK_TEMPLATES = {
category: 'memory',
timeout: 5000
},
// Session Context - Fires once per session at startup
// Uses state file to detect first prompt, only fires once
// Session Context - Progressive disclosure based on session state
// First prompt: returns cluster overview, subsequent: intent-matched sessions
'session-context': {
event: 'UserPromptSubmit',
matcher: '',
command: 'bash',
args: ['-c', 'STATE_FILE="/tmp/.ccw-session-$CLAUDE_SESSION_ID"; [ -f "$STATE_FILE" ] && exit 0; touch "$STATE_FILE"; curl -s -X POST -H "Content-Type: application/json" -d "{\\"sessionId\\":\\"$CLAUDE_SESSION_ID\\"}" http://localhost:3456/api/hook/session-context 2>/dev/null | jq -r ".content // empty"'],
description: 'Load session context once at startup (cluster overview)',
command: 'ccw',
args: ['hook', 'session-context', '--stdin'],
description: 'Progressive session context (cluster overview → intent matching)',
category: 'context',
timeout: 5000
}

View File

@@ -449,8 +449,23 @@ function isHookTemplateInstalled(templateId) {
const template = HOOK_TEMPLATES[templateId];
if (!template) return false;
// Build expected command string
const templateCmd = template.command + (template.args ? ' ' + template.args.join(' ') : '');
// Define unique patterns for each template type (more specific than just command)
const uniquePatterns = {
'session-context': 'hook session-context',
'codexlens-update': 'codexlens update',
'ccw-notify': 'api/hook',
'log-tool': 'tool-usage.log',
'lint-check': 'eslint',
'git-add': 'git add',
'memory-file-read': 'memory track --type file --action read',
'memory-file-write': 'memory track --type file --action write',
'memory-prompt-track': 'memory track --type topic',
'skill-context-auto': 'skill-context-auto'
};
// Use unique pattern if defined, otherwise fall back to command + args
const searchPattern = uniquePatterns[templateId] ||
(template.command + (template.args ? ' ' + template.args.join(' ') : ''));
// Check project hooks
const projectHooks = hookConfig.project?.hooks?.[template.event];
@@ -459,7 +474,7 @@ function isHookTemplateInstalled(templateId) {
if (hookList.some(h => {
// Check both old format (h.command) and new format (h.hooks[0].command)
const cmd = h.hooks?.[0]?.command || h.command || '';
return cmd.includes(template.command);
return cmd.includes(searchPattern);
})) return true;
}
@@ -469,7 +484,7 @@ function isHookTemplateInstalled(templateId) {
const hookList = Array.isArray(globalHooks) ? globalHooks : [globalHooks];
if (hookList.some(h => {
const cmd = h.hooks?.[0]?.command || h.command || '';
return cmd.includes(template.command);
return cmd.includes(searchPattern);
})) return true;
}
@@ -512,7 +527,7 @@ async function uninstallHookTemplate(templateId) {
// Define unique patterns for each template type
const uniquePatterns = {
'session-context': 'api/hook/session-context',
'session-context': 'hook session-context',
'codexlens-update': 'codexlens update',
'ccw-notify': 'api/hook',
'log-tool': 'tool-usage.log',

View File

@@ -244,6 +244,7 @@ interface SearchMetadata {
warning?: string;
note?: string;
index_status?: 'indexed' | 'not_indexed' | 'partial';
fallback?: string; // Fallback mode used (e.g., 'fuzzy')
fallback_history?: string[];
suggested_weights?: Record<string, number>;
// Tokenization metadata (ripgrep mode)