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,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostToolUse Hook - Executable
|
|
3
|
+
*
|
|
4
|
+
* Records what was actually changed after Edit/Write completes.
|
|
5
|
+
* Creates memory entries for significant changes.
|
|
6
|
+
*/
|
|
7
|
+
import type { HookResult } from '../types/index.js';
|
|
8
|
+
export interface PostToolUseEvent {
|
|
9
|
+
tool_name: string;
|
|
10
|
+
parameters: Record<string, unknown>;
|
|
11
|
+
result: {
|
|
12
|
+
success: boolean;
|
|
13
|
+
output?: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
interface ChangeRecord {
|
|
18
|
+
file: string;
|
|
19
|
+
type: 'edit' | 'write' | 'delete';
|
|
20
|
+
linesChanged?: number;
|
|
21
|
+
summary?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class PostToolUseHook {
|
|
24
|
+
private config;
|
|
25
|
+
private projectRoot;
|
|
26
|
+
private client;
|
|
27
|
+
private sessionChanges;
|
|
28
|
+
/**
|
|
29
|
+
* Initialize the hook
|
|
30
|
+
*/
|
|
31
|
+
init(projectRoot?: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Execute the hook after a tool completes
|
|
34
|
+
*/
|
|
35
|
+
execute(event: PostToolUseEvent): Promise<HookResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Record a significant change to memory
|
|
38
|
+
*/
|
|
39
|
+
private recordChange;
|
|
40
|
+
/**
|
|
41
|
+
* Generate description for change
|
|
42
|
+
*/
|
|
43
|
+
private generateChangeDescription;
|
|
44
|
+
/**
|
|
45
|
+
* Get all changes recorded this session
|
|
46
|
+
*/
|
|
47
|
+
getSessionChanges(): ChangeRecord[];
|
|
48
|
+
/**
|
|
49
|
+
* Create session summary
|
|
50
|
+
*/
|
|
51
|
+
createSessionSummary(): Promise<{
|
|
52
|
+
id: string;
|
|
53
|
+
} | null>;
|
|
54
|
+
/**
|
|
55
|
+
* Clear session changes
|
|
56
|
+
*/
|
|
57
|
+
clearSession(): void;
|
|
58
|
+
}
|
|
59
|
+
export declare function runPostToolUseHook(eventJson: string): Promise<void>;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=post-tool-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-tool-use.d.ts","sourceRoot":"","sources":["../../src/hooks/post-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA+B,MAAM,mBAAmB,CAAA;AAShF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;IACjC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA0GD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,cAAc,CAAqB;IAE3C;;OAEG;IACG,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/C;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IA0C3D;;OAEG;YACW,YAAY;IA4B1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAkBjC;;OAEG;IACH,iBAAiB,IAAI,YAAY,EAAE;IAInC;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IA6C5D;;OAEG;IACH,YAAY,IAAI,IAAI;CAGrB;AAMD,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostToolUse Hook - Executable
|
|
3
|
+
*
|
|
4
|
+
* Records what was actually changed after Edit/Write completes.
|
|
5
|
+
* Creates memory entries for significant changes.
|
|
6
|
+
*/
|
|
7
|
+
import { loadConfig } from '../utils/config.js';
|
|
8
|
+
import { getProjectRoot, matchesPattern } from '../utils/paths.js';
|
|
9
|
+
import { createDrizzleClient } from '../db/drizzle-client.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// CHANGE ANALYSIS
|
|
12
|
+
// =============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Analyze what was changed
|
|
15
|
+
*/
|
|
16
|
+
function analyzeChange(event) {
|
|
17
|
+
const { tool_name, parameters, result } = event;
|
|
18
|
+
if (!result.success) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
switch (tool_name) {
|
|
22
|
+
case 'Edit': {
|
|
23
|
+
const filePath = parameters.file_path;
|
|
24
|
+
const oldString = parameters.old_string;
|
|
25
|
+
const newString = parameters.new_string;
|
|
26
|
+
if (!filePath)
|
|
27
|
+
return null;
|
|
28
|
+
const linesChanged = Math.abs((newString?.split('\n').length ?? 0) - (oldString?.split('\n').length ?? 0));
|
|
29
|
+
return {
|
|
30
|
+
file: filePath,
|
|
31
|
+
type: 'edit',
|
|
32
|
+
linesChanged,
|
|
33
|
+
summary: `Edited ${filePath.split('/').pop()}`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
case 'Write': {
|
|
37
|
+
const filePath = parameters.file_path;
|
|
38
|
+
const content = parameters.content;
|
|
39
|
+
if (!filePath)
|
|
40
|
+
return null;
|
|
41
|
+
return {
|
|
42
|
+
file: filePath,
|
|
43
|
+
type: 'write',
|
|
44
|
+
linesChanged: content?.split('\n').length ?? 0,
|
|
45
|
+
summary: `Created ${filePath.split('/').pop()}`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
default:
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Determine if change is significant enough to record
|
|
54
|
+
*/
|
|
55
|
+
function isSignificantChange(change, config) {
|
|
56
|
+
// Critical paths are always significant
|
|
57
|
+
if (matchesPattern(change.file, config.checkpoint.criticalPaths)) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
// Check minimum lines changed
|
|
61
|
+
if (change.linesChanged && change.linesChanged >= config.checkpoint.minLinesChanged) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
// New files are significant
|
|
65
|
+
if (change.type === 'write') {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract domain from file path
|
|
72
|
+
*/
|
|
73
|
+
function extractDomain(filePath, domains) {
|
|
74
|
+
const pathLower = filePath.toLowerCase();
|
|
75
|
+
for (const domain of domains) {
|
|
76
|
+
if (pathLower.includes(domain.replace(/-/g, '/')) ||
|
|
77
|
+
pathLower.includes(domain.replace(/-/g, '_'))) {
|
|
78
|
+
return domain;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Fallback detection
|
|
82
|
+
if (pathLower.includes('/schema/'))
|
|
83
|
+
return 'schema';
|
|
84
|
+
if (pathLower.includes('/api/') || pathLower.includes('/routers/'))
|
|
85
|
+
return 'api';
|
|
86
|
+
if (pathLower.includes('/components/'))
|
|
87
|
+
return 'components';
|
|
88
|
+
if (pathLower.includes('/hooks/'))
|
|
89
|
+
return 'hooks';
|
|
90
|
+
return 'general';
|
|
91
|
+
}
|
|
92
|
+
// =============================================================================
|
|
93
|
+
// MAIN HOOK CLASS
|
|
94
|
+
// =============================================================================
|
|
95
|
+
export class PostToolUseHook {
|
|
96
|
+
config = null;
|
|
97
|
+
projectRoot = null;
|
|
98
|
+
client = null;
|
|
99
|
+
sessionChanges = [];
|
|
100
|
+
/**
|
|
101
|
+
* Initialize the hook
|
|
102
|
+
*/
|
|
103
|
+
async init(projectRoot) {
|
|
104
|
+
this.projectRoot = projectRoot ?? await getProjectRoot();
|
|
105
|
+
this.config = await loadConfig(this.projectRoot);
|
|
106
|
+
try {
|
|
107
|
+
this.client = createDrizzleClient(this.config.system);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// DB not available, will log locally
|
|
111
|
+
console.warn('[PostToolUse] Database not available, recording changes locally');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Execute the hook after a tool completes
|
|
116
|
+
*/
|
|
117
|
+
async execute(event) {
|
|
118
|
+
if (!this.config || !this.projectRoot) {
|
|
119
|
+
await this.init();
|
|
120
|
+
}
|
|
121
|
+
const config = this.config;
|
|
122
|
+
// Skip if checkpointing disabled
|
|
123
|
+
if (!config.checkpoint.enabled) {
|
|
124
|
+
return { mode: 'proceed' };
|
|
125
|
+
}
|
|
126
|
+
// Analyze the change
|
|
127
|
+
const change = analyzeChange(event);
|
|
128
|
+
if (!change) {
|
|
129
|
+
return { mode: 'proceed' };
|
|
130
|
+
}
|
|
131
|
+
// Check if excluded
|
|
132
|
+
if (matchesPattern(change.file, config.checkpoint.excludePaths)) {
|
|
133
|
+
return { mode: 'proceed' };
|
|
134
|
+
}
|
|
135
|
+
// Track the change
|
|
136
|
+
this.sessionChanges.push(change);
|
|
137
|
+
// Check if significant
|
|
138
|
+
if (!isSignificantChange(change, config)) {
|
|
139
|
+
return { mode: 'proceed' };
|
|
140
|
+
}
|
|
141
|
+
// Record significant change
|
|
142
|
+
try {
|
|
143
|
+
await this.recordChange(change, config);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error('[PostToolUse] Failed to record change:', error);
|
|
147
|
+
}
|
|
148
|
+
return { mode: 'proceed' };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Record a significant change to memory
|
|
152
|
+
*/
|
|
153
|
+
async recordChange(change, config) {
|
|
154
|
+
const domain = extractDomain(change.file, config.domains);
|
|
155
|
+
const content = {
|
|
156
|
+
title: change.summary ?? `Change to ${change.file}`,
|
|
157
|
+
body: this.generateChangeDescription(change),
|
|
158
|
+
domain,
|
|
159
|
+
source: 'checkpoint',
|
|
160
|
+
relatedFiles: [change.file],
|
|
161
|
+
};
|
|
162
|
+
if (this.client) {
|
|
163
|
+
// Save to database
|
|
164
|
+
await this.client.createMemory(content, [
|
|
165
|
+
'auto-checkpoint',
|
|
166
|
+
domain,
|
|
167
|
+
change.type,
|
|
168
|
+
]);
|
|
169
|
+
console.log(`📝 [PostToolUse] Recorded: ${content.title}`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// Log locally
|
|
173
|
+
console.log(`📝 [PostToolUse] Change recorded (local): ${content.title}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Generate description for change
|
|
178
|
+
*/
|
|
179
|
+
generateChangeDescription(change) {
|
|
180
|
+
const lines = [];
|
|
181
|
+
lines.push(`## Change Details`);
|
|
182
|
+
lines.push('');
|
|
183
|
+
lines.push(`- **File**: ${change.file}`);
|
|
184
|
+
lines.push(`- **Type**: ${change.type}`);
|
|
185
|
+
if (change.linesChanged) {
|
|
186
|
+
lines.push(`- **Lines changed**: ${change.linesChanged}`);
|
|
187
|
+
}
|
|
188
|
+
lines.push('');
|
|
189
|
+
lines.push(`*Recorded at ${new Date().toISOString()}*`);
|
|
190
|
+
return lines.join('\n');
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get all changes recorded this session
|
|
194
|
+
*/
|
|
195
|
+
getSessionChanges() {
|
|
196
|
+
return [...this.sessionChanges];
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Create session summary
|
|
200
|
+
*/
|
|
201
|
+
async createSessionSummary() {
|
|
202
|
+
if (this.sessionChanges.length === 0) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
const config = this.config;
|
|
206
|
+
const changes = this.sessionChanges;
|
|
207
|
+
// Group by domain
|
|
208
|
+
const byDomain = new Map();
|
|
209
|
+
for (const change of changes) {
|
|
210
|
+
const domain = extractDomain(change.file, config.domains);
|
|
211
|
+
const existing = byDomain.get(domain) ?? [];
|
|
212
|
+
existing.push(change);
|
|
213
|
+
byDomain.set(domain, existing);
|
|
214
|
+
}
|
|
215
|
+
// Generate summary
|
|
216
|
+
const lines = ['## Session Summary', ''];
|
|
217
|
+
for (const [domain, domainChanges] of byDomain) {
|
|
218
|
+
lines.push(`### ${domain}`);
|
|
219
|
+
for (const change of domainChanges) {
|
|
220
|
+
lines.push(`- ${change.type}: ${change.file.split('/').pop()}`);
|
|
221
|
+
}
|
|
222
|
+
lines.push('');
|
|
223
|
+
}
|
|
224
|
+
lines.push(`**Total changes**: ${changes.length}`);
|
|
225
|
+
lines.push(`**Domains affected**: ${byDomain.size}`);
|
|
226
|
+
const content = {
|
|
227
|
+
title: `Session Summary: ${changes.length} changes`,
|
|
228
|
+
body: lines.join('\n'),
|
|
229
|
+
source: 'checkpoint',
|
|
230
|
+
relatedFiles: changes.map(c => c.file),
|
|
231
|
+
};
|
|
232
|
+
if (this.client) {
|
|
233
|
+
return this.client.createMemory(content, ['session-summary']);
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Clear session changes
|
|
239
|
+
*/
|
|
240
|
+
clearSession() {
|
|
241
|
+
this.sessionChanges = [];
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// =============================================================================
|
|
245
|
+
// STANDALONE EXECUTION
|
|
246
|
+
// =============================================================================
|
|
247
|
+
export async function runPostToolUseHook(eventJson) {
|
|
248
|
+
const event = JSON.parse(eventJson);
|
|
249
|
+
const hook = new PostToolUseHook();
|
|
250
|
+
const result = await hook.execute(event);
|
|
251
|
+
console.log(JSON.stringify(result));
|
|
252
|
+
}
|
|
253
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
254
|
+
const eventJson = process.argv[2];
|
|
255
|
+
if (eventJson) {
|
|
256
|
+
runPostToolUseHook(eventJson).catch(console.error);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
console.error('Usage: node post-tool-use.js <event-json>');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=post-tool-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hooks/post-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAA4B,MAAM,yBAAyB,CAAA;AAuBvF,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;GAEG;AACH,SAAS,aAAa,CAAC,KAAuB;IAC5C,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAE/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAmB,CAAA;YAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,UAAoB,CAAA;YACjD,MAAM,SAAS,GAAG,UAAU,CAAC,UAAoB,CAAA;YAEjD,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAA;YAE1B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAC5E,CAAA;YAED,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;gBACZ,YAAY;gBACZ,OAAO,EAAE,UAAU,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;aAC/C,CAAA;QACH,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAmB,CAAA;YAC/C,MAAM,OAAO,GAAG,UAAU,CAAC,OAAiB,CAAA;YAE5C,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAA;YAE1B,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,OAAO;gBACb,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;gBAC9C,OAAO,EAAE,WAAW,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;aAChD,CAAA;QACH,CAAC;QAED;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,MAAoB,EACpB,MAAoB;IAEpB,wCAAwC;IACxC,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,8BAA8B;IAC9B,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;QACpF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,QAAgB,EAAE,OAAiB;IACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;IAExC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC7C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,QAAQ,CAAA;IACnD,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAA;IAChF,IAAI,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,YAAY,CAAA;IAC3D,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,OAAO,CAAA;IAEjD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,MAAM,OAAO,eAAe;IAClB,MAAM,GAAwB,IAAI,CAAA;IAClC,WAAW,GAAkB,IAAI,CAAA;IACjC,MAAM,GAA+B,IAAI,CAAA;IACzC,cAAc,GAAmB,EAAE,CAAA;IAE3C;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,WAAoB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,MAAM,cAAc,EAAE,CAAA;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAEhD,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;YACrC,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,KAAuB;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAO,CAAA;QAE3B,iCAAiC;QACjC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC5B,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC5B,CAAC;QAED,oBAAoB;QACpB,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC5B,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAEhC,uBAAuB;QACvB,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC5B,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAA;QAChE,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IAC5B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CACxB,MAAoB,EACpB,MAAoB;QAEpB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QAEzD,MAAM,OAAO,GAAkB;YAC7B,KAAK,EAAE,MAAM,CAAC,OAAO,IAAI,aAAa,MAAM,CAAC,IAAI,EAAE;YACnD,IAAI,EAAE,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC;YAC5C,MAAM;YACN,MAAM,EAAE,YAAY;YACpB,YAAY,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;SAC5B,CAAA;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,mBAAmB;YACnB,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE;gBACtC,iBAAiB;gBACjB,MAAM;gBACN,MAAM,CAAC,IAAI;aACZ,CAAC,CAAA;YACF,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;QAC5D,CAAC;aAAM,CAAC;YACN,cAAc;YACd,OAAO,CAAC,GAAG,CAAC,6CAA6C,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;QAC3E,CAAC;IACH,CAAC;IAED;;OAEG;IACK,yBAAyB,CAAC,MAAoB;QACpD,MAAM,KAAK,GAAa,EAAE,CAAA;QAE1B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QACxC,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAExC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAA;QAC3D,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QAEvD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAA;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB;QACxB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAO,CAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAA;QAEnC,kBAAkB;QAClB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAA;QAClD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;YACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;YAC3C,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACrB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAChC,CAAC;QAED,mBAAmB;QACnB,MAAM,KAAK,GAAa,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAA;QAElD,KAAK,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,EAAE,CAAC,CAAA;YAC3B,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACjE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QAClD,KAAK,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;QAEpD,MAAM,OAAO,GAAkB;YAC7B,KAAK,EAAE,oBAAoB,OAAO,CAAC,MAAM,UAAU;YACnD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACtB,MAAM,EAAE,YAAY;YACpB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACvC,CAAA;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,cAAc,GAAG,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAqB,CAAA;IACvD,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;AACrC,CAAC;AAED,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjC,IAAI,SAAS,EAAE,CAAC;QACd,kBAAkB,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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 type { HookResult, PreToolUseEvent } from '../types/index.js';
|
|
10
|
+
export declare class PreToolUseHook {
|
|
11
|
+
private config;
|
|
12
|
+
private projectRoot;
|
|
13
|
+
/**
|
|
14
|
+
* Initialize the hook
|
|
15
|
+
*/
|
|
16
|
+
init(projectRoot?: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Execute the hook for a tool call
|
|
19
|
+
*/
|
|
20
|
+
execute(event: PreToolUseEvent): Promise<HookResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Handle Edit/Write tool calls - run guards
|
|
23
|
+
*/
|
|
24
|
+
private handleFileOperation;
|
|
25
|
+
/**
|
|
26
|
+
* Handle Task tool calls - inject knowledge
|
|
27
|
+
*/
|
|
28
|
+
private handleTaskTool;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run hook as standalone script (reads event from stdin)
|
|
32
|
+
*/
|
|
33
|
+
export declare function runPreToolUseHook(): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=pre-tool-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-tool-use.d.ts","sourceRoot":"","sources":["../../src/hooks/pre-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAEV,UAAU,EACV,eAAe,EAMhB,MAAM,mBAAmB,CAAA;AAwQ1B,qBAAa,cAAc;IACzB,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,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAuB1D;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiD3B;;OAEG;YACW,cAAc;CA6C7B;AAMD;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBvD"}
|