oh-my-claudecode 0.2.4 → 0.2.7
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 +103 -4
- package/commands/necronomicon-bind.md +45 -82
- package/dist/agents/builtin-agents.d.ts.map +1 -1
- package/dist/agents/builtin-agents.js +8 -0
- package/dist/agents/builtin-agents.js.map +1 -1
- package/dist/agents/cthulhu.d.ts.map +1 -1
- package/dist/agents/cthulhu.js +11 -0
- package/dist/agents/cthulhu.js.map +1 -1
- package/dist/agents/dagon.d.ts.map +1 -1
- package/dist/agents/dagon.js +13 -0
- package/dist/agents/dagon.js.map +1 -1
- package/dist/agents/nodens-advanced.d.ts +182 -0
- package/dist/agents/nodens-advanced.d.ts.map +1 -0
- package/dist/agents/nodens-advanced.js +297 -0
- package/dist/agents/nodens-advanced.js.map +1 -0
- package/dist/agents/nodens.d.ts +42 -0
- package/dist/agents/nodens.d.ts.map +1 -0
- package/dist/agents/nodens.js +147 -0
- package/dist/agents/nodens.js.map +1 -0
- package/dist/agents/shoggoth.d.ts.map +1 -1
- package/dist/agents/shoggoth.js +11 -1
- package/dist/agents/shoggoth.js.map +1 -1
- package/dist/cli/bind.d.ts +24 -0
- package/dist/cli/bind.d.ts.map +1 -1
- package/dist/cli/bind.js +92 -25
- package/dist/cli/bind.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +7 -5
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +54 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +28 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/config/schema.d.ts +648 -17
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +21 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/features/web-research-background/advanced-patterns.d.ts +44 -0
- package/dist/features/web-research-background/advanced-patterns.d.ts.map +1 -0
- package/dist/features/web-research-background/advanced-patterns.js +139 -0
- package/dist/features/web-research-background/advanced-patterns.js.map +1 -0
- package/dist/features/web-research-background/index.d.ts +73 -0
- package/dist/features/web-research-background/index.d.ts.map +1 -0
- package/dist/features/web-research-background/index.js +131 -0
- package/dist/features/web-research-background/index.js.map +1 -0
- package/dist/features/yith-archive/functions/opencode-import.d.ts.map +1 -1
- package/dist/features/yith-archive/functions/opencode-import.js +129 -90
- package/dist/features/yith-archive/functions/opencode-import.js.map +1 -1
- package/dist/features/yith-archive/index.d.ts +8 -0
- package/dist/features/yith-archive/index.d.ts.map +1 -1
- package/dist/features/yith-archive/index.js +1 -0
- package/dist/features/yith-archive/index.js.map +1 -1
- package/dist/features/yith-archive/types.d.ts +15 -0
- package/dist/features/yith-archive/types.d.ts.map +1 -1
- package/dist/hooks/design-detector-hook.d.ts +12 -0
- package/dist/hooks/design-detector-hook.d.ts.map +1 -0
- package/dist/hooks/design-detector-hook.js +42 -0
- package/dist/hooks/design-detector-hook.js.map +1 -0
- package/dist/hooks/design-detector.d.ts +47 -0
- package/dist/hooks/design-detector.d.ts.map +1 -0
- package/dist/hooks/design-detector.js +251 -0
- package/dist/hooks/design-detector.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +27 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/web-research-detector.d.ts +58 -0
- package/dist/hooks/web-research-detector.d.ts.map +1 -0
- package/dist/hooks/web-research-detector.js +205 -0
- package/dist/hooks/web-research-detector.js.map +1 -0
- package/dist/hooks/web-research-hook.d.ts +12 -0
- package/dist/hooks/web-research-hook.d.ts.map +1 -0
- package/dist/hooks/web-research-hook.js +43 -0
- package/dist/hooks/web-research-hook.js.map +1 -0
- package/dist/hooks/yith-capture.d.ts +35 -0
- package/dist/hooks/yith-capture.d.ts.map +1 -0
- package/dist/hooks/yith-capture.js +113 -0
- package/dist/hooks/yith-capture.js.map +1 -0
- package/dist/linters/type-safety-ast.d.ts +108 -0
- package/dist/linters/type-safety-ast.d.ts.map +1 -0
- package/dist/linters/type-safety-ast.js +293 -0
- package/dist/linters/type-safety-ast.js.map +1 -0
- package/dist/linters/type-safety-linter.d.ts +66 -0
- package/dist/linters/type-safety-linter.d.ts.map +1 -0
- package/dist/linters/type-safety-linter.js +317 -0
- package/dist/linters/type-safety-linter.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design Task Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects when a user message indicates a frontend/design task.
|
|
5
|
+
* Used to route messages to Nodens subagent.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* HIGH confidence design keywords — strongly indicate design tasks
|
|
9
|
+
*/
|
|
10
|
+
const HIGH_CONFIDENCE_KEYWORDS = [
|
|
11
|
+
// Component/UI terms
|
|
12
|
+
"component",
|
|
13
|
+
"ui",
|
|
14
|
+
"interface",
|
|
15
|
+
"design",
|
|
16
|
+
"button",
|
|
17
|
+
"card",
|
|
18
|
+
"form",
|
|
19
|
+
"modal",
|
|
20
|
+
"dialog",
|
|
21
|
+
"sidebar",
|
|
22
|
+
"navbar",
|
|
23
|
+
"menu",
|
|
24
|
+
"dropdown",
|
|
25
|
+
"tooltip",
|
|
26
|
+
"popover",
|
|
27
|
+
"accordion",
|
|
28
|
+
"tab",
|
|
29
|
+
"carousel",
|
|
30
|
+
// Layout/styling
|
|
31
|
+
"layout",
|
|
32
|
+
"responsive",
|
|
33
|
+
"mobile-first",
|
|
34
|
+
"breakpoint",
|
|
35
|
+
"css",
|
|
36
|
+
"tailwind",
|
|
37
|
+
"style",
|
|
38
|
+
"theme",
|
|
39
|
+
"dark mode",
|
|
40
|
+
"flexbox",
|
|
41
|
+
"grid",
|
|
42
|
+
// Accessibility
|
|
43
|
+
"accessibility",
|
|
44
|
+
"wcag",
|
|
45
|
+
"aria",
|
|
46
|
+
"semantic html",
|
|
47
|
+
"keyboard navigation",
|
|
48
|
+
"screen reader",
|
|
49
|
+
// Design system
|
|
50
|
+
"design system",
|
|
51
|
+
"design tokens",
|
|
52
|
+
"component library",
|
|
53
|
+
"storybook",
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* MEDIUM confidence design keywords — suggest design tasks
|
|
57
|
+
*/
|
|
58
|
+
const MEDIUM_CONFIDENCE_KEYWORDS = [
|
|
59
|
+
// Framework/library specific
|
|
60
|
+
"react",
|
|
61
|
+
"vue",
|
|
62
|
+
"svelte",
|
|
63
|
+
"angular",
|
|
64
|
+
"next.js",
|
|
65
|
+
"nuxt",
|
|
66
|
+
"astro",
|
|
67
|
+
"solid",
|
|
68
|
+
// UI libraries
|
|
69
|
+
"shadcn",
|
|
70
|
+
"material-ui",
|
|
71
|
+
"chakra",
|
|
72
|
+
"radix",
|
|
73
|
+
"ant-design",
|
|
74
|
+
"storybook",
|
|
75
|
+
// General design
|
|
76
|
+
"color",
|
|
77
|
+
"typography",
|
|
78
|
+
"animation",
|
|
79
|
+
"transition",
|
|
80
|
+
"interaction",
|
|
81
|
+
"user experience",
|
|
82
|
+
"ux",
|
|
83
|
+
"ui/ux",
|
|
84
|
+
"mockup",
|
|
85
|
+
"prototype",
|
|
86
|
+
"wireframe",
|
|
87
|
+
"styling",
|
|
88
|
+
"style",
|
|
89
|
+
// Styling tools
|
|
90
|
+
"sass",
|
|
91
|
+
"less",
|
|
92
|
+
"postcss",
|
|
93
|
+
"emotion",
|
|
94
|
+
"styled-components",
|
|
95
|
+
"css-in-js",
|
|
96
|
+
];
|
|
97
|
+
/**
|
|
98
|
+
* LOW confidence design keywords — weak signal for design tasks
|
|
99
|
+
* Used as fallback when other keywords are present
|
|
100
|
+
*/
|
|
101
|
+
const LOW_CONFIDENCE_KEYWORDS = [
|
|
102
|
+
"design",
|
|
103
|
+
"build",
|
|
104
|
+
"create",
|
|
105
|
+
"make",
|
|
106
|
+
"implement",
|
|
107
|
+
"polish",
|
|
108
|
+
"refine",
|
|
109
|
+
"improve",
|
|
110
|
+
"visual",
|
|
111
|
+
"appearance",
|
|
112
|
+
];
|
|
113
|
+
/**
|
|
114
|
+
* Negative patterns — indicate this is NOT a design task
|
|
115
|
+
*/
|
|
116
|
+
const NEGATIVE_PATTERNS = [
|
|
117
|
+
/\bdesign\s+(pattern|doc|document|spec)\b/i, // "design document", "design spec"
|
|
118
|
+
/\bsystem\s+design\b/i, // "system design" (infrastructure)
|
|
119
|
+
/\b(database|schema|architecture|algorithm|data|api|network)\s+design\b/i, // Non-UI design
|
|
120
|
+
/\bdesign\s+(system|database|schema|architecture|algorithm|data|api|network|relational|query)\b/i, // "design system", "design database"
|
|
121
|
+
/\bdesign\s+a\s+(relational\s+)?(database|system|algorithm|schema|api|network|backend|server)\b/i, // "design a database"
|
|
122
|
+
];
|
|
123
|
+
/**
|
|
124
|
+
* Detects if a user message indicates a design task.
|
|
125
|
+
*
|
|
126
|
+
* Strategy:
|
|
127
|
+
* 1. Check for HIGH confidence keywords (component, ui, interface, etc.)
|
|
128
|
+
* 2. If not found, check MEDIUM confidence keywords (react, vue, animation, etc.)
|
|
129
|
+
* 3. If not found, check LOW confidence keywords
|
|
130
|
+
* 4. Verify no negative patterns are present
|
|
131
|
+
* 5. Return confidence level and matched keywords
|
|
132
|
+
*
|
|
133
|
+
* @param userMessage - The user's input message
|
|
134
|
+
* @returns Detection result with confidence and matched keywords
|
|
135
|
+
*/
|
|
136
|
+
export function detectDesignTask(userMessage) {
|
|
137
|
+
const message = userMessage.toLowerCase().trim();
|
|
138
|
+
// Very short messages unlikely to be design tasks
|
|
139
|
+
if (message.length < 8) {
|
|
140
|
+
return {
|
|
141
|
+
isDesignTask: false,
|
|
142
|
+
confidence: "low",
|
|
143
|
+
keywords: [],
|
|
144
|
+
reason: "Message too short to detect design task",
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// Check for negative patterns first (filter out false positives)
|
|
148
|
+
for (const pattern of NEGATIVE_PATTERNS) {
|
|
149
|
+
if (pattern.test(message)) {
|
|
150
|
+
return {
|
|
151
|
+
isDesignTask: false,
|
|
152
|
+
confidence: "low",
|
|
153
|
+
keywords: [],
|
|
154
|
+
reason: `Matched negative pattern: ${pattern.source}`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Check HIGH confidence keywords
|
|
159
|
+
const highMatches = findMatchingKeywords(message, HIGH_CONFIDENCE_KEYWORDS);
|
|
160
|
+
if (highMatches.length > 0) {
|
|
161
|
+
return {
|
|
162
|
+
isDesignTask: true,
|
|
163
|
+
confidence: "high",
|
|
164
|
+
keywords: highMatches,
|
|
165
|
+
reason: `Found high-confidence design keywords: ${highMatches.join(", ")}`,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// Check MEDIUM confidence keywords
|
|
169
|
+
const mediumMatches = findMatchingKeywords(message, MEDIUM_CONFIDENCE_KEYWORDS);
|
|
170
|
+
if (mediumMatches.length >= 2) {
|
|
171
|
+
// Require at least 2 medium keywords
|
|
172
|
+
return {
|
|
173
|
+
isDesignTask: true,
|
|
174
|
+
confidence: "medium",
|
|
175
|
+
keywords: mediumMatches,
|
|
176
|
+
reason: `Found multiple medium-confidence keywords: ${mediumMatches.join(", ")}`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Check if there's a high context for design (e.g., specific frameworks + design intent)
|
|
180
|
+
if (mediumMatches.length === 1) {
|
|
181
|
+
const frameworks = ["react", "vue", "svelte", "angular", "next.js", "nuxt", "astro"];
|
|
182
|
+
const isFramework = frameworks.some(fw => message.includes(fw));
|
|
183
|
+
const designIntents = [
|
|
184
|
+
"build",
|
|
185
|
+
"create",
|
|
186
|
+
"make",
|
|
187
|
+
"design",
|
|
188
|
+
"style",
|
|
189
|
+
"implement",
|
|
190
|
+
"component",
|
|
191
|
+
];
|
|
192
|
+
const hasDesignIntent = designIntents.some(intent => message.includes(intent));
|
|
193
|
+
if (isFramework && hasDesignIntent) {
|
|
194
|
+
return {
|
|
195
|
+
isDesignTask: true,
|
|
196
|
+
confidence: "medium",
|
|
197
|
+
keywords: mediumMatches,
|
|
198
|
+
reason: `Framework + design intent detected: ${mediumMatches.join(", ")}`,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Check LOW confidence keywords as last resort
|
|
203
|
+
const lowMatches = findMatchingKeywords(message, LOW_CONFIDENCE_KEYWORDS);
|
|
204
|
+
if (lowMatches.length >= 2) {
|
|
205
|
+
return {
|
|
206
|
+
isDesignTask: true,
|
|
207
|
+
confidence: "low",
|
|
208
|
+
keywords: lowMatches,
|
|
209
|
+
reason: `Found low-confidence design keywords: ${lowMatches.join(", ")}`,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// No design task detected
|
|
213
|
+
return {
|
|
214
|
+
isDesignTask: false,
|
|
215
|
+
confidence: "low",
|
|
216
|
+
keywords: [],
|
|
217
|
+
reason: "No design keywords or patterns detected",
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Finds matching keywords in a message
|
|
222
|
+
* @param message - The message to search in
|
|
223
|
+
* @param keywords - The keywords to match
|
|
224
|
+
* @returns Array of matched keywords (unique)
|
|
225
|
+
*/
|
|
226
|
+
function findMatchingKeywords(message, keywords) {
|
|
227
|
+
const matched = new Set();
|
|
228
|
+
for (const keyword of keywords) {
|
|
229
|
+
// Use word boundaries to avoid partial matches
|
|
230
|
+
// "component" should match "component" but not "decompose"
|
|
231
|
+
const pattern = new RegExp(`\\b${keyword}\\b`, "i");
|
|
232
|
+
if (pattern.test(message)) {
|
|
233
|
+
matched.add(keyword);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return Array.from(matched);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Export for testing
|
|
240
|
+
* Finds keywords in message without case sensitivity
|
|
241
|
+
*/
|
|
242
|
+
export function findDesignKeywords(message) {
|
|
243
|
+
const highMatches = findMatchingKeywords(message, HIGH_CONFIDENCE_KEYWORDS);
|
|
244
|
+
if (highMatches.length > 0)
|
|
245
|
+
return highMatches;
|
|
246
|
+
const mediumMatches = findMatchingKeywords(message, MEDIUM_CONFIDENCE_KEYWORDS);
|
|
247
|
+
if (mediumMatches.length > 0)
|
|
248
|
+
return mediumMatches;
|
|
249
|
+
return findMatchingKeywords(message, LOW_CONFIDENCE_KEYWORDS);
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=design-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-detector.js","sourceRoot":"","sources":["../../src/hooks/design-detector.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -6,6 +6,9 @@ export { RULES_INJECTOR_HOOK_SCRIPT, getRulesInjectorHookConfig } from "./rules-
|
|
|
6
6
|
export { WRITE_GUARD_HOOK_SCRIPT, getWriteGuardHookConfig } from "./write-guard.js";
|
|
7
7
|
export { CTHULHU_AUTO_HOOK_SCRIPT, getCthulhuAutoHookConfig } from "./cthulhu-auto.js";
|
|
8
8
|
export { MEMORY_OVERRIDE_HOOK_SCRIPT, getMemoryOverrideHookConfig } from "./memory-override.js";
|
|
9
|
+
export { YITH_CAPTURE_HOOK_SCRIPT, getYithCaptureHookConfig } from "./yith-capture.js";
|
|
10
|
+
export { WEB_RESEARCH_DETECTOR_HOOK_SCRIPT, getWebResearchDetectorHookConfig } from "./web-research-hook.js";
|
|
11
|
+
export { DESIGN_DETECTOR_HOOK_SCRIPT, getDesignDetectorHookConfig } from "./design-detector-hook.js";
|
|
9
12
|
export interface HookDefinition {
|
|
10
13
|
name: HookName;
|
|
11
14
|
event: "PreToolUse" | "PostToolUse" | "Stop" | "Notification" | "SessionStart";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEzE,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AACrG,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAChF,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAC/F,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAC5F,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AACnF,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEzE,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AACrG,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAChF,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAC/F,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAC5F,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AACnF,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAC/F,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,iCAAiC,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAA;AAC5G,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA;AAEpG,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,cAAc,GAAG,cAAc,CAAA;IAC9E,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf;AA2CD,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAuEhD,CAAA;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,EAAE,CAG9E;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAqBzF"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -5,6 +5,9 @@ export { RULES_INJECTOR_HOOK_SCRIPT, getRulesInjectorHookConfig } from "./rules-
|
|
|
5
5
|
export { WRITE_GUARD_HOOK_SCRIPT, getWriteGuardHookConfig } from "./write-guard.js";
|
|
6
6
|
export { CTHULHU_AUTO_HOOK_SCRIPT, getCthulhuAutoHookConfig } from "./cthulhu-auto.js";
|
|
7
7
|
export { MEMORY_OVERRIDE_HOOK_SCRIPT, getMemoryOverrideHookConfig } from "./memory-override.js";
|
|
8
|
+
export { YITH_CAPTURE_HOOK_SCRIPT, getYithCaptureHookConfig } from "./yith-capture.js";
|
|
9
|
+
export { WEB_RESEARCH_DETECTOR_HOOK_SCRIPT, getWebResearchDetectorHookConfig } from "./web-research-hook.js";
|
|
10
|
+
export { DESIGN_DETECTOR_HOOK_SCRIPT, getDesignDetectorHookConfig } from "./design-detector-hook.js";
|
|
8
11
|
import { TODO_CONTINUATION_HOOK_SCRIPT, getTodoContinuationHookConfig, } from "./todo-continuation.js";
|
|
9
12
|
import { ELDER_LOOP_HOOK_SCRIPT, getElderLoopHookConfig, } from "./elder-loop.js";
|
|
10
13
|
import { COMMENT_CHECKER_HOOK_SCRIPT, getCommentCheckerHookConfig, } from "./comment-checker.js";
|
|
@@ -12,6 +15,9 @@ import { RULES_INJECTOR_HOOK_SCRIPT, getRulesInjectorHookConfig, } from "./rules
|
|
|
12
15
|
import { WRITE_GUARD_HOOK_SCRIPT, getWriteGuardHookConfig, } from "./write-guard.js";
|
|
13
16
|
import { CTHULHU_AUTO_HOOK_SCRIPT, getCthulhuAutoHookConfig, } from "./cthulhu-auto.js";
|
|
14
17
|
import { MEMORY_OVERRIDE_HOOK_SCRIPT, getMemoryOverrideHookConfig, } from "./memory-override.js";
|
|
18
|
+
import { YITH_CAPTURE_HOOK_SCRIPT, getYithCaptureHookConfig, } from "./yith-capture.js";
|
|
19
|
+
import { WEB_RESEARCH_DETECTOR_HOOK_SCRIPT, getWebResearchDetectorHookConfig, } from "./web-research-hook.js";
|
|
20
|
+
import { DESIGN_DETECTOR_HOOK_SCRIPT, getDesignDetectorHookConfig, } from "./design-detector-hook.js";
|
|
15
21
|
/** All hook definitions for the plugin */
|
|
16
22
|
export const ALL_HOOK_DEFINITIONS = [
|
|
17
23
|
{
|
|
@@ -63,6 +69,27 @@ export const ALL_HOOK_DEFINITIONS = [
|
|
|
63
69
|
scriptContent: MEMORY_OVERRIDE_HOOK_SCRIPT,
|
|
64
70
|
config: getMemoryOverrideHookConfig(),
|
|
65
71
|
},
|
|
72
|
+
{
|
|
73
|
+
name: "yith-capture",
|
|
74
|
+
event: "Stop",
|
|
75
|
+
scriptPath: "~/.claude/hooks/yith-capture.sh",
|
|
76
|
+
scriptContent: YITH_CAPTURE_HOOK_SCRIPT,
|
|
77
|
+
config: getYithCaptureHookConfig(),
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "web-research-detector",
|
|
81
|
+
event: "PreToolUse",
|
|
82
|
+
scriptPath: "~/.claude/hooks/web-research-detector.sh",
|
|
83
|
+
scriptContent: WEB_RESEARCH_DETECTOR_HOOK_SCRIPT,
|
|
84
|
+
config: getWebResearchDetectorHookConfig(),
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "design-detector",
|
|
88
|
+
event: "PreToolUse",
|
|
89
|
+
scriptPath: "~/.claude/hooks/design-detector.sh",
|
|
90
|
+
scriptContent: DESIGN_DETECTOR_HOOK_SCRIPT,
|
|
91
|
+
config: getDesignDetectorHookConfig(),
|
|
92
|
+
},
|
|
66
93
|
];
|
|
67
94
|
/** Get hooks that should be installed, respecting disabled_hooks config */
|
|
68
95
|
export function getEnabledHooks(config) {
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AACrG,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAChF,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAC/F,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAC5F,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AACnF,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Research Detector
|
|
3
|
+
*
|
|
4
|
+
* Identifies when user messages indicate a need for web research.
|
|
5
|
+
* Used by web-research hook and agent prompts to enforce current knowledge.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Categories of web research triggers
|
|
9
|
+
*/
|
|
10
|
+
export declare enum WebResearchTriggerType {
|
|
11
|
+
VERSION_CHECK = "version_check",// "latest", "v3.5", "2024", version numbers
|
|
12
|
+
FRAMEWORK_SPECIFIC = "framework",// React, Vue, Next.js, etc.
|
|
13
|
+
DATE_SENSITIVE = "date_sensitive",// "what's new", "breaking changes", "deprecation"
|
|
14
|
+
LIBRARY_UPDATE = "library_update",// "npm updates", "package releases"
|
|
15
|
+
BEST_PRACTICES = "best_practices",// "best practice for X in 2024", "modern approach"
|
|
16
|
+
CURRENT_STATUS = "current_status"
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A detected web research trigger
|
|
20
|
+
*/
|
|
21
|
+
export interface WebResearchTrigger {
|
|
22
|
+
type: WebResearchTriggerType;
|
|
23
|
+
pattern: string;
|
|
24
|
+
context?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Confidence levels for web research need
|
|
28
|
+
*/
|
|
29
|
+
export type ResearchConfidence = "must" | "should" | "maybe";
|
|
30
|
+
/**
|
|
31
|
+
* Result of web research detection
|
|
32
|
+
*/
|
|
33
|
+
export interface WebResearchDetectionResult {
|
|
34
|
+
trigger: WebResearchTrigger | null;
|
|
35
|
+
confidence: ResearchConfidence;
|
|
36
|
+
reason?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Configuration for web research detector
|
|
40
|
+
*/
|
|
41
|
+
export interface WebResearchDetectorConfig {
|
|
42
|
+
enabled: boolean;
|
|
43
|
+
min_confidence?: "must" | "should" | "maybe";
|
|
44
|
+
trigger_types?: WebResearchTriggerType[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Detects if a user message indicates web research is needed.
|
|
48
|
+
*
|
|
49
|
+
* Strategy:
|
|
50
|
+
* 1. Check for "MUST" confidence triggers first (version checks, breaking changes)
|
|
51
|
+
* 2. If not found, check "SHOULD" triggers (frameworks, best practices)
|
|
52
|
+
* 3. If not found, return "MAYBE" or null
|
|
53
|
+
*
|
|
54
|
+
* @param userMessage - The user's input message
|
|
55
|
+
* @returns Detection result with trigger and confidence level
|
|
56
|
+
*/
|
|
57
|
+
export declare function detectWebResearchNeeded(userMessage: string): WebResearchDetectionResult;
|
|
58
|
+
//# sourceMappingURL=web-research-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-research-detector.d.ts","sourceRoot":"","sources":["../../src/hooks/web-research-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,oBAAY,sBAAsB;IAChC,aAAa,kBAAkB,CAAO,4CAA4C;IAClF,kBAAkB,cAAc,CAAM,4BAA4B;IAClE,cAAc,mBAAmB,CAAK,kDAAkD;IACxF,cAAc,mBAAmB,CAAK,oCAAoC;IAC1E,cAAc,mBAAmB,CAAK,mDAAmD;IACzF,cAAc,mBAAmB;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE5D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAClC,UAAU,EAAE,kBAAkB,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC5C,aAAa,CAAC,EAAE,sBAAsB,EAAE,CAAA;CACzC;AA4GD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,0BAA0B,CAuEvF"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Research Detector
|
|
3
|
+
*
|
|
4
|
+
* Identifies when user messages indicate a need for web research.
|
|
5
|
+
* Used by web-research hook and agent prompts to enforce current knowledge.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Categories of web research triggers
|
|
9
|
+
*/
|
|
10
|
+
export var WebResearchTriggerType;
|
|
11
|
+
(function (WebResearchTriggerType) {
|
|
12
|
+
WebResearchTriggerType["VERSION_CHECK"] = "version_check";
|
|
13
|
+
WebResearchTriggerType["FRAMEWORK_SPECIFIC"] = "framework";
|
|
14
|
+
WebResearchTriggerType["DATE_SENSITIVE"] = "date_sensitive";
|
|
15
|
+
WebResearchTriggerType["LIBRARY_UPDATE"] = "library_update";
|
|
16
|
+
WebResearchTriggerType["BEST_PRACTICES"] = "best_practices";
|
|
17
|
+
WebResearchTriggerType["CURRENT_STATUS"] = "current_status";
|
|
18
|
+
})(WebResearchTriggerType || (WebResearchTriggerType = {}));
|
|
19
|
+
/**
|
|
20
|
+
* Pattern definitions for web research detection
|
|
21
|
+
* Each pattern has: regex, trigger type, confidence level
|
|
22
|
+
*/
|
|
23
|
+
const TRIGGER_PATTERNS = [
|
|
24
|
+
// ─── VERSION CHECKS (MUST confidence) ─────────────────────────────────────
|
|
25
|
+
// Explicit v-prefix version numbers like "v3.5", "v18", "v2.3.0"
|
|
26
|
+
{
|
|
27
|
+
pattern: /\bv\d+(?:\.\d+)?(?:\.\d+)?(?:-\w+)?/,
|
|
28
|
+
trigger: WebResearchTriggerType.VERSION_CHECK,
|
|
29
|
+
confidence: "must",
|
|
30
|
+
},
|
|
31
|
+
// Semantic versioning patterns "2.3.0", "3.5", "18.0"
|
|
32
|
+
{
|
|
33
|
+
pattern: /\b(\d+\.\d+(?:\.\d+)?)\b/,
|
|
34
|
+
trigger: WebResearchTriggerType.VERSION_CHECK,
|
|
35
|
+
confidence: "must",
|
|
36
|
+
},
|
|
37
|
+
// "latest version", "latest update", "latest release"
|
|
38
|
+
{
|
|
39
|
+
pattern: /\b(latest\s+(version|release|update|api))\b/i,
|
|
40
|
+
trigger: WebResearchTriggerType.VERSION_CHECK,
|
|
41
|
+
confidence: "must",
|
|
42
|
+
},
|
|
43
|
+
// Years (2023, 2024, 2025)
|
|
44
|
+
{
|
|
45
|
+
pattern: /\b(202[3-9])\b/,
|
|
46
|
+
trigger: WebResearchTriggerType.VERSION_CHECK,
|
|
47
|
+
confidence: "should",
|
|
48
|
+
},
|
|
49
|
+
// ─── FRAMEWORK-SPECIFIC (SHOULD confidence) ─────────────────────────────────
|
|
50
|
+
// Major frameworks: React, Vue, Angular, Svelte, Next.js, Nuxt, etc.
|
|
51
|
+
{
|
|
52
|
+
pattern: /\b(React|Vue|Angular|Svelte|Next\.js|Nuxt|Ember\.js|Astro|Remix|SolidJS)\b/i,
|
|
53
|
+
trigger: WebResearchTriggerType.FRAMEWORK_SPECIFIC,
|
|
54
|
+
confidence: "should",
|
|
55
|
+
},
|
|
56
|
+
// Node.js, Python, Go, Rust version references
|
|
57
|
+
{
|
|
58
|
+
pattern: /\b(Node\.js|Python|Go|Rust|Java|C#)\s+(\d+|LTS|latest)\b/i,
|
|
59
|
+
trigger: WebResearchTriggerType.FRAMEWORK_SPECIFIC,
|
|
60
|
+
confidence: "should",
|
|
61
|
+
},
|
|
62
|
+
// Popular packages: TypeScript, Webpack, Vitest, Playwright, etc.
|
|
63
|
+
{
|
|
64
|
+
pattern: /\b(TypeScript|Webpack|Vite|Turbopack|Playwright|Cypress|Jest|Vitest|ESLint|Prettier)\b/i,
|
|
65
|
+
trigger: WebResearchTriggerType.FRAMEWORK_SPECIFIC,
|
|
66
|
+
confidence: "should",
|
|
67
|
+
},
|
|
68
|
+
// ─── DATE-SENSITIVE QUERIES (MUST confidence) ─────────────────────────────
|
|
69
|
+
// "breaking changes", "what changed", "deprecat*"
|
|
70
|
+
{
|
|
71
|
+
pattern: /\b(breaking\s+changes|what\s+changed|deprecat\w+|removed\s+in)\b/i,
|
|
72
|
+
trigger: WebResearchTriggerType.DATE_SENSITIVE,
|
|
73
|
+
confidence: "must",
|
|
74
|
+
},
|
|
75
|
+
// "what's new", "what's the latest", "anything new"
|
|
76
|
+
{
|
|
77
|
+
pattern: /\b(what'?s\s+new|what'?s\s+the\s+latest|anything\s+new)\b/i,
|
|
78
|
+
trigger: WebResearchTriggerType.DATE_SENSITIVE,
|
|
79
|
+
confidence: "must",
|
|
80
|
+
},
|
|
81
|
+
// "current best practice", "modern approach", "in 2024"
|
|
82
|
+
{
|
|
83
|
+
pattern: /\b(current\s+best\s+practice|modern\s+approach|modern\s+way|best\s+way\s+to)\b/i,
|
|
84
|
+
trigger: WebResearchTriggerType.DATE_SENSITIVE,
|
|
85
|
+
confidence: "should",
|
|
86
|
+
},
|
|
87
|
+
// ─── LIBRARY/PACKAGE UPDATES (SHOULD confidence) ──────────────────────────
|
|
88
|
+
// "npm", "package.json", "dependencies", "updates"
|
|
89
|
+
{
|
|
90
|
+
pattern: /\b(npm\s+update|package\s+update|latest\s+version|new\s+release)\b/i,
|
|
91
|
+
trigger: WebResearchTriggerType.LIBRARY_UPDATE,
|
|
92
|
+
confidence: "should",
|
|
93
|
+
},
|
|
94
|
+
// ─── BEST PRACTICES (SHOULD confidence) ────────────────────────────────────
|
|
95
|
+
// "best practice for X", "recommended way to"
|
|
96
|
+
{
|
|
97
|
+
pattern: /\b(best\s+practice|best\s+way|recommended\s+way|recommended\s+approach)\b/i,
|
|
98
|
+
trigger: WebResearchTriggerType.BEST_PRACTICES,
|
|
99
|
+
confidence: "should",
|
|
100
|
+
},
|
|
101
|
+
// ─── CURRENT STATUS (SHOULD confidence) ────────────────────────────────────
|
|
102
|
+
// "is X still maintained", "is X still supported", "does X still work"
|
|
103
|
+
{
|
|
104
|
+
pattern: /\b(is\s+.*\s+(still\s+)?(maintained|supported|used|working|active))\b/i,
|
|
105
|
+
trigger: WebResearchTriggerType.CURRENT_STATUS,
|
|
106
|
+
confidence: "should",
|
|
107
|
+
},
|
|
108
|
+
// "dead project", "abandoned", "no longer maintained"
|
|
109
|
+
{
|
|
110
|
+
pattern: /\b(dead\s+project|abandoned|no\s+longer\s+maintained|unmaintained)\b/i,
|
|
111
|
+
trigger: WebResearchTriggerType.CURRENT_STATUS,
|
|
112
|
+
confidence: "should",
|
|
113
|
+
},
|
|
114
|
+
];
|
|
115
|
+
/**
|
|
116
|
+
* Detects if a user message indicates web research is needed.
|
|
117
|
+
*
|
|
118
|
+
* Strategy:
|
|
119
|
+
* 1. Check for "MUST" confidence triggers first (version checks, breaking changes)
|
|
120
|
+
* 2. If not found, check "SHOULD" triggers (frameworks, best practices)
|
|
121
|
+
* 3. If not found, return "MAYBE" or null
|
|
122
|
+
*
|
|
123
|
+
* @param userMessage - The user's input message
|
|
124
|
+
* @returns Detection result with trigger and confidence level
|
|
125
|
+
*/
|
|
126
|
+
export function detectWebResearchNeeded(userMessage) {
|
|
127
|
+
// Normalize the input
|
|
128
|
+
const message = userMessage.toLowerCase().trim();
|
|
129
|
+
// Avoid obvious false positives
|
|
130
|
+
// "my latest project" should not trigger on "latest"
|
|
131
|
+
// "design document" should not trigger as "design"
|
|
132
|
+
const isFalsePositive = (text) => {
|
|
133
|
+
// Very short messages probably don't need web research
|
|
134
|
+
if (text.length < 10)
|
|
135
|
+
return true;
|
|
136
|
+
// Avoid false positives from common phrases
|
|
137
|
+
const falsePositivePhrases = [
|
|
138
|
+
/\bmy\s+latest\s+/i, // "my latest project"
|
|
139
|
+
/\bthe\s+latest\s+trends\b/i, // "the latest trends"
|
|
140
|
+
/\bliterally\s+/i, // "literally latest"
|
|
141
|
+
];
|
|
142
|
+
return falsePositivePhrases.some(phrase => phrase.test(text));
|
|
143
|
+
};
|
|
144
|
+
if (isFalsePositive(message)) {
|
|
145
|
+
return { trigger: null, confidence: "maybe" };
|
|
146
|
+
}
|
|
147
|
+
// Collect all matches with their confidence levels
|
|
148
|
+
let bestMatch = null;
|
|
149
|
+
let bestConfidenceLevel = 0; // must = 3, should = 2, maybe = 1
|
|
150
|
+
const confidenceLevels = { must: 3, should: 2, maybe: 1 };
|
|
151
|
+
for (const { pattern, trigger, confidence } of TRIGGER_PATTERNS) {
|
|
152
|
+
if (pattern.test(message)) {
|
|
153
|
+
const match = message.match(pattern);
|
|
154
|
+
const confidenceValue = confidenceLevels[confidence];
|
|
155
|
+
// Keep the match with the highest confidence level
|
|
156
|
+
if (confidenceValue > bestConfidenceLevel) {
|
|
157
|
+
bestConfidenceLevel = confidenceValue;
|
|
158
|
+
bestMatch = {
|
|
159
|
+
trigger: {
|
|
160
|
+
type: trigger,
|
|
161
|
+
pattern: match?.[0] || "",
|
|
162
|
+
context: extractContext(message, match?.[0]),
|
|
163
|
+
},
|
|
164
|
+
confidence,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (bestMatch) {
|
|
170
|
+
return {
|
|
171
|
+
...bestMatch,
|
|
172
|
+
reason: bestMatch.confidence === "must"
|
|
173
|
+
? `Found strong indicator: "${bestMatch.trigger.pattern}"`
|
|
174
|
+
: `Found indicator: "${bestMatch.trigger.pattern}"`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
// No triggers found, but check if message is asking about current/new information
|
|
178
|
+
// This gives us a low "maybe" confidence for general queries
|
|
179
|
+
if (/\b(how|what|why|when|where|which)\b/i.test(message)) {
|
|
180
|
+
return {
|
|
181
|
+
trigger: null,
|
|
182
|
+
confidence: "maybe",
|
|
183
|
+
reason: "Generic question detected",
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return { trigger: null, confidence: "maybe" };
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Extracts context around a matched pattern for informational purposes.
|
|
190
|
+
* @param text - The full text
|
|
191
|
+
* @param pattern - The matched pattern
|
|
192
|
+
* @returns A substring with context (up to 80 chars)
|
|
193
|
+
*/
|
|
194
|
+
function extractContext(text, pattern) {
|
|
195
|
+
if (!pattern)
|
|
196
|
+
return undefined;
|
|
197
|
+
const index = text.indexOf(pattern);
|
|
198
|
+
if (index === -1)
|
|
199
|
+
return undefined;
|
|
200
|
+
const start = Math.max(0, index - 20);
|
|
201
|
+
const end = Math.min(text.length, index + pattern.length + 20);
|
|
202
|
+
const context = text.substring(start, end).trim();
|
|
203
|
+
return context.length <= 80 ? context : context.substring(0, 77) + "...";
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=web-research-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-research-detector.js","sourceRoot":"","sources":["../../src/hooks/web-research-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Research Detector Hook
|
|
3
|
+
*
|
|
4
|
+
* PreToolUse hook that detects when user messages indicate a need for web research.
|
|
5
|
+
* Injects system context reminding agents about enforcing current knowledge.
|
|
6
|
+
*
|
|
7
|
+
* When triggered, it warns the agent that web research may be needed and suggests
|
|
8
|
+
* searching for current information before providing answers.
|
|
9
|
+
*/
|
|
10
|
+
export declare const WEB_RESEARCH_DETECTOR_HOOK_SCRIPT = "#!/usr/bin/env bash\n# oh-my-claudecode: Web Research Detector PreToolUse Hook\n# Fires on tool use to detect web research needs and inject enforcement context.\n\nset -euo pipefail\n\nCLAUDE_API_PROMPT=\"${CLAUDE_API_PROMPT:-}\"\n\n# Extract a simple heuristic from the prompt: look for version patterns or date-sensitive keywords\n# This is a bash-level heuristic that doesn't need the full TypeScript detector\n\n# Check for version patterns: v1.0, 2024, latest, etc.\nif echo \"$CLAUDE_API_PROMPT\" | grep -qiE '\\b(v[0-9]+\\.[0-9]+|20[0-9]{2}|latest\\s+(version|release|update)|breaking\\s+changes|what.?s\\s+new)\\b'; then\n echo \"[WEB RESEARCH ENFORCEMENT]\"\n echo \"Detected request that may require current knowledge (version check, date-sensitive info).\"\n echo \"If you don't have current information available, consider:\"\n echo \" 1. Using WebSearch to find the latest information\"\n echo \" 2. Checking official documentation for the most recent updates\"\n echo \" 3. Being explicit about knowledge cutoff limitations\"\n echo \"\"\nfi\n";
|
|
11
|
+
export declare function getWebResearchDetectorHookConfig(): object;
|
|
12
|
+
//# sourceMappingURL=web-research-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-research-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/web-research-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,iCAAiC,gjCAqB7C,CAAA;AAED,wBAAgB,gCAAgC,IAAI,MAAM,CAUzD"}
|