Add standalone hook entry points for context, new, save, summary, and worker

- Implemented context-hook.ts for handling session start events.
- Created new-hook.ts for user prompt submission events.
- Developed save-hook.ts for post tool use events.
- Added summary-hook.ts for handling stop events.
- Introduced worker.ts as a standalone background process for the SDK agent.
- Each hook reads input from stdin, processes it, and handles errors gracefully.
This commit is contained in:
Alex Newman
2025-10-16 15:39:30 -04:00
parent 723f1f5374
commit 834cf4095e
20 changed files with 1563 additions and 63 deletions
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/env bun
/**
* Context Hook Entry Point - SessionStart
* Standalone executable for plugin hooks
*/
import { contextHook } from '../../hooks/context.js';
// Read input from stdin
const input = await Bun.stdin.text();
try {
const parsed = input.trim() ? JSON.parse(input) : undefined;
contextHook(parsed);
} catch (error: any) {
console.error(`[claude-mem context-hook error: ${error.message}]`);
process.exit(0);
}
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env bun
/**
* New Hook Entry Point - UserPromptSubmit
* Standalone executable for plugin hooks
*/
import { newHook } from '../../hooks/new.js';
// Read input from stdin
const input = await Bun.stdin.text();
try {
const parsed = input.trim() ? JSON.parse(input) : undefined;
newHook(parsed);
} catch (error: any) {
console.error(`[claude-mem new-hook error: ${error.message}]`);
console.log('{"continue": true, "suppressOutput": true}');
process.exit(0);
}
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env bun
/**
* Save Hook Entry Point - PostToolUse
* Standalone executable for plugin hooks
*/
import { saveHook } from '../../hooks/save.js';
// Read input from stdin
const input = await Bun.stdin.text();
try {
const parsed = input.trim() ? JSON.parse(input) : undefined;
saveHook(parsed);
} catch (error: any) {
console.error(`[claude-mem save-hook error: ${error.message}]`);
console.log('{"continue": true, "suppressOutput": true}');
process.exit(0);
}
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env bun
/**
* Summary Hook Entry Point - Stop
* Standalone executable for plugin hooks
*/
import { summaryHook } from '../../hooks/summary.js';
// Read input from stdin
const input = await Bun.stdin.text();
try {
const parsed = input.trim() ? JSON.parse(input) : undefined;
summaryHook(parsed);
} catch (error: any) {
console.error(`[claude-mem summary-hook error: ${error.message}]`);
console.log('{"continue": true, "suppressOutput": true}');
process.exit(0);
}
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bun
/**
* Worker Entry Point
* Standalone background process for SDK agent
*/
import { main } from '../../sdk/worker.js';
// Entry point - just call the worker main function
main().catch((error) => {
console.error('[SDK Worker] Fatal error:', error);
process.exit(1);
});
+19 -5
View File
@@ -48,11 +48,25 @@ export function newHook(input?: UserPromptSubmitInput): void {
db.close();
// Start SDK worker in background as detached process
// Use 'claude-mem worker' CLI command which is always available
const child = spawn('claude-mem', ['worker', sessionId.toString()], {
detached: true,
stdio: 'ignore'
});
// In plugin mode, use bundled worker; otherwise use global CLI
const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT;
let child;
if (pluginRoot) {
// Plugin mode: use bundled worker
const workerPath = path.join(pluginRoot, 'scripts', 'hooks', 'worker.js');
child = spawn('bun', [workerPath, sessionId.toString()], {
detached: true,
stdio: 'ignore'
});
} else {
// Traditional mode: use global CLI
child = spawn('claude-mem', ['worker', sessionId.toString()], {
detached: true,
stdio: 'ignore'
});
}
child.unref();
// Output hook response