cmp-memory-system 1.0.0
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 +541 -0
- package/dist/analytics/index.d.ts +5 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +5 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/tracker.d.ts +107 -0
- package/dist/analytics/tracker.d.ts.map +1 -0
- package/dist/analytics/tracker.js +333 -0
- package/dist/analytics/tracker.js.map +1 -0
- package/dist/auto-improve/eslint-generator.d.ts +36 -0
- package/dist/auto-improve/eslint-generator.d.ts.map +1 -0
- package/dist/auto-improve/eslint-generator.js +280 -0
- package/dist/auto-improve/eslint-generator.js.map +1 -0
- package/dist/auto-improve/index.d.ts +6 -0
- package/dist/auto-improve/index.d.ts.map +1 -0
- package/dist/auto-improve/index.js +6 -0
- package/dist/auto-improve/index.js.map +1 -0
- package/dist/auto-improve/pattern-detector.d.ts +92 -0
- package/dist/auto-improve/pattern-detector.d.ts.map +1 -0
- package/dist/auto-improve/pattern-detector.js +231 -0
- package/dist/auto-improve/pattern-detector.js.map +1 -0
- package/dist/cli/index.d.ts +16 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +636 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/dashboard/index.d.ts +6 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +6 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/server.d.ts +15 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +373 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/ui.d.ts +9 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +530 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/db/client.d.ts +66 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +159 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/drizzle-client.d.ts +302 -0
- package/dist/db/drizzle-client.d.ts.map +1 -0
- package/dist/db/drizzle-client.js +404 -0
- package/dist/db/drizzle-client.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/feedback/collector.d.ts +74 -0
- package/dist/feedback/collector.d.ts.map +1 -0
- package/dist/feedback/collector.js +231 -0
- package/dist/feedback/collector.js.map +1 -0
- package/dist/feedback/index.d.ts +5 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +5 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/memory-checkpoint.d.ts +43 -0
- package/dist/hooks/memory-checkpoint.d.ts.map +1 -0
- package/dist/hooks/memory-checkpoint.js +257 -0
- package/dist/hooks/memory-checkpoint.js.map +1 -0
- package/dist/hooks/post-tool-use.d.ts +61 -0
- package/dist/hooks/post-tool-use.d.ts.map +1 -0
- package/dist/hooks/post-tool-use.js +262 -0
- package/dist/hooks/post-tool-use.js.map +1 -0
- package/dist/hooks/pre-tool-use.d.ts +34 -0
- package/dist/hooks/pre-tool-use.d.ts.map +1 -0
- package/dist/hooks/pre-tool-use.js +358 -0
- package/dist/hooks/pre-tool-use.js.map +1 -0
- package/dist/hooks/session-start.d.ts +38 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +274 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +42 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +599 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/registry/embeddings.d.ts +38 -0
- package/dist/registry/embeddings.d.ts.map +1 -0
- package/dist/registry/embeddings.js +110 -0
- package/dist/registry/embeddings.js.map +1 -0
- package/dist/registry/generator.d.ts +41 -0
- package/dist/registry/generator.d.ts.map +1 -0
- package/dist/registry/generator.js +323 -0
- package/dist/registry/generator.js.map +1 -0
- package/dist/registry/index.d.ts +6 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +6 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/services/IdeaCollector.d.ts +103 -0
- package/dist/services/IdeaCollector.d.ts.map +1 -0
- package/dist/services/IdeaCollector.js +371 -0
- package/dist/services/IdeaCollector.js.map +1 -0
- package/dist/services/TaskTracker.d.ts +89 -0
- package/dist/services/TaskTracker.d.ts.map +1 -0
- package/dist/services/TaskTracker.js +324 -0
- package/dist/services/TaskTracker.js.map +1 -0
- package/dist/services/WorkPlanManager.d.ts +107 -0
- package/dist/services/WorkPlanManager.d.ts.map +1 -0
- package/dist/services/WorkPlanManager.js +440 -0
- package/dist/services/WorkPlanManager.js.map +1 -0
- package/dist/services/auto-inject.d.ts +77 -0
- package/dist/services/auto-inject.d.ts.map +1 -0
- package/dist/services/auto-inject.js +289 -0
- package/dist/services/auto-inject.js.map +1 -0
- package/dist/services/auto-tag.d.ts +61 -0
- package/dist/services/auto-tag.d.ts.map +1 -0
- package/dist/services/auto-tag.js +203 -0
- package/dist/services/auto-tag.js.map +1 -0
- package/dist/services/cross-project-sync.d.ts +76 -0
- package/dist/services/cross-project-sync.d.ts.map +1 -0
- package/dist/services/cross-project-sync.js +235 -0
- package/dist/services/cross-project-sync.js.map +1 -0
- package/dist/services/index.d.ts +15 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/memory-consolidation.d.ts +77 -0
- package/dist/services/memory-consolidation.d.ts.map +1 -0
- package/dist/services/memory-consolidation.js +298 -0
- package/dist/services/memory-consolidation.js.map +1 -0
- package/dist/services/semantic-search.d.ts +93 -0
- package/dist/services/semantic-search.d.ts.map +1 -0
- package/dist/services/semantic-search.js +278 -0
- package/dist/services/semantic-search.js.map +1 -0
- package/dist/services/weekly-digest.d.ts +105 -0
- package/dist/services/weekly-digest.d.ts.map +1 -0
- package/dist/services/weekly-digest.js +292 -0
- package/dist/services/weekly-digest.js.map +1 -0
- package/dist/types/index.d.ts +274 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +84 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.d.ts +21 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +89 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/paths.d.ts +28 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +80 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +89 -0
- package/templates/memory-config.json +82 -0
- package/templates/memory-config.schema.json +212 -0
- package/templates/settings.json +58 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PreToolUse Hook - Executable
|
|
3
|
+
*
|
|
4
|
+
* Validates tool calls against configured guards:
|
|
5
|
+
* 1. Schema protection (block modifications to protected files)
|
|
6
|
+
* 2. Pattern validation (warn about bad patterns)
|
|
7
|
+
* 3. Embedding injection (inject relevant knowledge for Task tool)
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'fs/promises';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { loadConfig } from '../utils/config.js';
|
|
12
|
+
import { getProjectRoot, matchesPattern } from '../utils/paths.js';
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// GUARD VALIDATION
|
|
15
|
+
// =============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Check if content matches a regex pattern
|
|
18
|
+
*/
|
|
19
|
+
function matchesContentTrigger(content, trigger) {
|
|
20
|
+
try {
|
|
21
|
+
const regex = new RegExp(trigger, 'gm');
|
|
22
|
+
return regex.test(content);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Invalid regex, treat as literal match
|
|
26
|
+
return content.includes(trigger);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate a single guard rule against file and content
|
|
31
|
+
*/
|
|
32
|
+
function validateGuard(rule, filePath, content) {
|
|
33
|
+
// Check file pattern
|
|
34
|
+
if (!matchesPattern(filePath, [rule.filePattern])) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
// Check excluded files
|
|
38
|
+
if (rule.excludeFiles && matchesPattern(filePath, rule.excludeFiles)) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
// Check content trigger if specified
|
|
42
|
+
if (rule.contentTrigger && content) {
|
|
43
|
+
if (!matchesContentTrigger(content, rule.contentTrigger)) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Guard triggered
|
|
48
|
+
return {
|
|
49
|
+
ruleId: rule.id,
|
|
50
|
+
type: rule.type,
|
|
51
|
+
message: rule.message,
|
|
52
|
+
file: filePath,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Run all guards against a file operation
|
|
57
|
+
*/
|
|
58
|
+
function runGuards(config, filePath, content) {
|
|
59
|
+
if (!config.guards.enabled) {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const violations = [];
|
|
63
|
+
for (const rule of config.guards.rules) {
|
|
64
|
+
const violation = validateGuard(rule, filePath, content);
|
|
65
|
+
if (violation) {
|
|
66
|
+
violations.push(violation);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return violations;
|
|
70
|
+
}
|
|
71
|
+
// =============================================================================
|
|
72
|
+
// EMBEDDING INJECTION
|
|
73
|
+
// =============================================================================
|
|
74
|
+
/**
|
|
75
|
+
* Generate embedding using OpenAI or Gemini
|
|
76
|
+
*/
|
|
77
|
+
async function generateEmbedding(text) {
|
|
78
|
+
const openaiKey = process.env.OPENAI_API_KEY;
|
|
79
|
+
const geminiKey = process.env.GEMINI_API_KEY;
|
|
80
|
+
// Try OpenAI first
|
|
81
|
+
if (openaiKey) {
|
|
82
|
+
try {
|
|
83
|
+
const response = await fetch('https://api.openai.com/v1/embeddings', {
|
|
84
|
+
method: 'POST',
|
|
85
|
+
headers: {
|
|
86
|
+
'Content-Type': 'application/json',
|
|
87
|
+
'Authorization': `Bearer ${openaiKey}`
|
|
88
|
+
},
|
|
89
|
+
body: JSON.stringify({
|
|
90
|
+
model: 'text-embedding-3-small',
|
|
91
|
+
input: text.slice(0, 8000 * 4),
|
|
92
|
+
encoding_format: 'float'
|
|
93
|
+
})
|
|
94
|
+
});
|
|
95
|
+
if (response.ok) {
|
|
96
|
+
const data = await response.json();
|
|
97
|
+
return data.data[0]?.embedding ?? null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Fall through to Gemini
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Try Gemini
|
|
105
|
+
if (geminiKey) {
|
|
106
|
+
try {
|
|
107
|
+
const response = await fetch(`https://generativelanguage.googleapis.com/v1/models/text-embedding-004:embedContent?key=${geminiKey}`, {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: { 'Content-Type': 'application/json' },
|
|
110
|
+
body: JSON.stringify({
|
|
111
|
+
content: { parts: [{ text: text.slice(0, 10000) }] }
|
|
112
|
+
})
|
|
113
|
+
});
|
|
114
|
+
if (response.ok) {
|
|
115
|
+
const data = await response.json();
|
|
116
|
+
return data.embedding.values;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// No embedding available
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Compute cosine similarity between two vectors
|
|
127
|
+
*/
|
|
128
|
+
function cosineSimilarity(a, b) {
|
|
129
|
+
if (a.length !== b.length)
|
|
130
|
+
return 0;
|
|
131
|
+
let dotProduct = 0;
|
|
132
|
+
let magnitudeA = 0;
|
|
133
|
+
let magnitudeB = 0;
|
|
134
|
+
for (let i = 0; i < a.length; i++) {
|
|
135
|
+
dotProduct += a[i] * b[i];
|
|
136
|
+
magnitudeA += a[i] * a[i];
|
|
137
|
+
magnitudeB += b[i] * b[i];
|
|
138
|
+
}
|
|
139
|
+
const magnitude = Math.sqrt(magnitudeA) * Math.sqrt(magnitudeB);
|
|
140
|
+
return magnitude === 0 ? 0 : dotProduct / magnitude;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Load embedding registry
|
|
144
|
+
*/
|
|
145
|
+
async function loadRegistry(projectRoot) {
|
|
146
|
+
const registryPath = path.join(projectRoot, '.claude/knowledge/registry.json');
|
|
147
|
+
try {
|
|
148
|
+
const content = await fs.readFile(registryPath, 'utf-8');
|
|
149
|
+
return JSON.parse(content);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Find matching knowledge sections for a query
|
|
157
|
+
*/
|
|
158
|
+
async function findMatchingSections(projectRoot, queryText, config) {
|
|
159
|
+
if (!config.embedding.enabled) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
const registry = await loadRegistry(projectRoot);
|
|
163
|
+
if (!registry || registry.sections.length === 0) {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
const queryEmbedding = await generateEmbedding(queryText);
|
|
167
|
+
if (!queryEmbedding) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
// Find matches
|
|
171
|
+
const matches = registry.sections
|
|
172
|
+
.map(section => ({
|
|
173
|
+
...section,
|
|
174
|
+
similarity: cosineSimilarity(queryEmbedding, section.embedding)
|
|
175
|
+
}))
|
|
176
|
+
.filter(s => s.similarity >= config.embedding.threshold)
|
|
177
|
+
.sort((a, b) => {
|
|
178
|
+
// Prioritize CRITICAL sections if configured
|
|
179
|
+
if (config.embedding.prioritizeCritical) {
|
|
180
|
+
if (a.criticality === 'CRITICAL' && b.criticality !== 'CRITICAL')
|
|
181
|
+
return -1;
|
|
182
|
+
if (b.criticality === 'CRITICAL' && a.criticality !== 'CRITICAL')
|
|
183
|
+
return 1;
|
|
184
|
+
}
|
|
185
|
+
return b.similarity - a.similarity;
|
|
186
|
+
})
|
|
187
|
+
.slice(0, config.embedding.maxSections);
|
|
188
|
+
return matches;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Load content of a knowledge section
|
|
192
|
+
*/
|
|
193
|
+
async function loadSectionContent(projectRoot, sectionPath) {
|
|
194
|
+
const fullPath = path.join(projectRoot, sectionPath);
|
|
195
|
+
return fs.readFile(fullPath, 'utf-8');
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Format matching sections as injectable context
|
|
199
|
+
*/
|
|
200
|
+
function formatInjectedContext(matches, contents, system) {
|
|
201
|
+
const totalTokens = matches.reduce((sum, m) => sum + m.tokens, 0);
|
|
202
|
+
const criticalityBadges = {
|
|
203
|
+
CRITICAL: '🔴 CRITICAL',
|
|
204
|
+
HIGH: '🟡 HIGH',
|
|
205
|
+
MEDIUM: '🟢 MEDIUM',
|
|
206
|
+
LOW: '⚪ LOW'
|
|
207
|
+
};
|
|
208
|
+
const sections = matches
|
|
209
|
+
.map((match, i) => {
|
|
210
|
+
const badge = criticalityBadges[match.criticality] ?? '';
|
|
211
|
+
const similarity = Math.round(match.similarity * 100);
|
|
212
|
+
return `## ${match.title} (${similarity}% match) ${badge}\n\n${contents[i]}\n\n---`;
|
|
213
|
+
})
|
|
214
|
+
.join('\n\n');
|
|
215
|
+
return `<relevant_knowledge source="metanautical-memory" system="${system}" sections="${matches.length}" tokens="${totalTokens}">
|
|
216
|
+
|
|
217
|
+
${sections}
|
|
218
|
+
|
|
219
|
+
</relevant_knowledge>
|
|
220
|
+
|
|
221
|
+
**System Note**: Loaded ${matches.length} knowledge sections (${totalTokens.toLocaleString()} tokens) via semantic matching.`;
|
|
222
|
+
}
|
|
223
|
+
// =============================================================================
|
|
224
|
+
// MAIN HOOK CLASS
|
|
225
|
+
// =============================================================================
|
|
226
|
+
export class PreToolUseHook {
|
|
227
|
+
config = null;
|
|
228
|
+
projectRoot = null;
|
|
229
|
+
/**
|
|
230
|
+
* Initialize the hook
|
|
231
|
+
*/
|
|
232
|
+
async init(projectRoot) {
|
|
233
|
+
this.projectRoot = projectRoot ?? await getProjectRoot();
|
|
234
|
+
this.config = await loadConfig(this.projectRoot);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Execute the hook for a tool call
|
|
238
|
+
*/
|
|
239
|
+
async execute(event) {
|
|
240
|
+
if (!this.config || !this.projectRoot) {
|
|
241
|
+
await this.init();
|
|
242
|
+
}
|
|
243
|
+
const config = this.config;
|
|
244
|
+
const projectRoot = this.projectRoot;
|
|
245
|
+
const toolName = event.tool_name;
|
|
246
|
+
// Handle different tools
|
|
247
|
+
switch (toolName) {
|
|
248
|
+
case 'Edit':
|
|
249
|
+
case 'Write':
|
|
250
|
+
return this.handleFileOperation(event, config);
|
|
251
|
+
case 'Task':
|
|
252
|
+
return this.handleTaskTool(event, config, projectRoot);
|
|
253
|
+
default:
|
|
254
|
+
return { mode: 'proceed' };
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Handle Edit/Write tool calls - run guards
|
|
259
|
+
*/
|
|
260
|
+
handleFileOperation(event, config) {
|
|
261
|
+
const filePath = event.parameters.file_path;
|
|
262
|
+
const content = (event.parameters.new_string ?? event.parameters.content);
|
|
263
|
+
if (!filePath) {
|
|
264
|
+
return { mode: 'proceed' };
|
|
265
|
+
}
|
|
266
|
+
// Run guards
|
|
267
|
+
const violations = runGuards(config, filePath, content);
|
|
268
|
+
if (violations.length === 0) {
|
|
269
|
+
return { mode: 'proceed' };
|
|
270
|
+
}
|
|
271
|
+
// Check for blocking violations
|
|
272
|
+
const blockingViolations = violations.filter(v => v.type === 'block');
|
|
273
|
+
const warnings = violations.filter(v => v.type === 'warn' || v.type === 'suggest');
|
|
274
|
+
if (blockingViolations.length > 0) {
|
|
275
|
+
const messages = blockingViolations.map(v => `⛔ ${v.ruleId.toUpperCase()}: ${v.message}`);
|
|
276
|
+
return {
|
|
277
|
+
mode: 'block',
|
|
278
|
+
message: messages.join('\n\n'),
|
|
279
|
+
violations: blockingViolations,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (warnings.length > 0) {
|
|
283
|
+
const messages = warnings.map(v => `⚠️ ${v.ruleId}: ${v.message}`);
|
|
284
|
+
return {
|
|
285
|
+
mode: 'warn',
|
|
286
|
+
message: messages.join('\n\n'),
|
|
287
|
+
violations: warnings,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
return { mode: 'proceed' };
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Handle Task tool calls - inject knowledge
|
|
294
|
+
*/
|
|
295
|
+
async handleTaskTool(event, config, projectRoot) {
|
|
296
|
+
const prompt = event.parameters.prompt;
|
|
297
|
+
const description = event.parameters.description;
|
|
298
|
+
if (!prompt && !description) {
|
|
299
|
+
return { mode: 'proceed' };
|
|
300
|
+
}
|
|
301
|
+
const queryText = `${description ?? ''}\n\n${prompt ?? ''}`.trim();
|
|
302
|
+
if (queryText.length < 20) {
|
|
303
|
+
return { mode: 'proceed' };
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
// Find matching sections
|
|
307
|
+
const matches = await findMatchingSections(projectRoot, queryText, config);
|
|
308
|
+
if (matches.length === 0) {
|
|
309
|
+
return { mode: 'proceed' };
|
|
310
|
+
}
|
|
311
|
+
// Load section contents
|
|
312
|
+
const contents = await Promise.all(matches.map(m => loadSectionContent(projectRoot, m.path)));
|
|
313
|
+
// Format context
|
|
314
|
+
const context = formatInjectedContext(matches, contents, config.system);
|
|
315
|
+
console.log(`📚 [${config.system}] Injected ${matches.length} knowledge sections`);
|
|
316
|
+
return {
|
|
317
|
+
mode: 'inject_context',
|
|
318
|
+
context,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
console.error('[PreToolUse] Embedding error:', error);
|
|
323
|
+
return { mode: 'proceed' };
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// =============================================================================
|
|
328
|
+
// STANDALONE EXECUTION
|
|
329
|
+
// =============================================================================
|
|
330
|
+
/**
|
|
331
|
+
* Run hook as standalone script (reads event from stdin)
|
|
332
|
+
*/
|
|
333
|
+
export async function runPreToolUseHook() {
|
|
334
|
+
const hook = new PreToolUseHook();
|
|
335
|
+
// Read event from stdin or args
|
|
336
|
+
let event;
|
|
337
|
+
if (process.argv[2]) {
|
|
338
|
+
// Event passed as argument
|
|
339
|
+
event = JSON.parse(process.argv[2]);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
// Read from stdin
|
|
343
|
+
const chunks = [];
|
|
344
|
+
for await (const chunk of process.stdin) {
|
|
345
|
+
chunks.push(chunk);
|
|
346
|
+
}
|
|
347
|
+
const input = Buffer.concat(chunks).toString('utf-8');
|
|
348
|
+
event = JSON.parse(input);
|
|
349
|
+
}
|
|
350
|
+
const result = await hook.execute(event);
|
|
351
|
+
// Output result as JSON
|
|
352
|
+
console.log(JSON.stringify(result));
|
|
353
|
+
}
|
|
354
|
+
// Execute if run directly
|
|
355
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
356
|
+
runPreToolUseHook().catch(console.error);
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=pre-tool-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../src/hooks/pre-tool-use.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionStart Hook - Executable
|
|
3
|
+
*
|
|
4
|
+
* Loads relevant context when a Claude session starts:
|
|
5
|
+
* 1. Detects which module user is working on (via git diff)
|
|
6
|
+
* 2. Queries DEV_Items for recent memories of that module
|
|
7
|
+
* 3. Returns formatted context for injection
|
|
8
|
+
*/
|
|
9
|
+
import type { HookResult, MemoryConfig } from '../types/index.js';
|
|
10
|
+
export declare class SessionStartHook {
|
|
11
|
+
private config;
|
|
12
|
+
private projectRoot;
|
|
13
|
+
/**
|
|
14
|
+
* Initialize the hook
|
|
15
|
+
*/
|
|
16
|
+
init(projectRoot?: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Execute the session start hook
|
|
19
|
+
*/
|
|
20
|
+
execute(): Promise<HookResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Load workflow context (plan, tasks, ideas)
|
|
23
|
+
*/
|
|
24
|
+
private loadWorkflowContext;
|
|
25
|
+
/**
|
|
26
|
+
* Get current configuration
|
|
27
|
+
*/
|
|
28
|
+
getConfig(): MemoryConfig | null;
|
|
29
|
+
/**
|
|
30
|
+
* Get detected project root
|
|
31
|
+
*/
|
|
32
|
+
getProjectRoot(): string | null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Run hook as standalone script
|
|
36
|
+
*/
|
|
37
|
+
export declare function runSessionStartHook(): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=session-start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAEV,UAAU,EAEV,YAAY,EAEb,MAAM,mBAAmB,CAAA;AA8O1B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAAsB;IAEzC;;OAEG;IACG,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IA0CpC;;OAEG;YACW,mBAAmB;IAoCjC;;OAEG;IACH,SAAS,IAAI,YAAY,GAAG,IAAI;IAIhC;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;CAGhC;AAMD;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOzD"}
|