@timmeck/brain 3.14.1 → 3.15.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.
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// UserPromptSubmit hook — injects Brain's self-improvement suggestions into Claude's context
|
|
3
|
+
// Brain writes improvement requests to ~/.brain/improvement-requests.md during feedback cycles.
|
|
4
|
+
// This hook checks for new entries and shows them to Claude automatically.
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
const IMPROVEMENTS_FILE = path.join(os.homedir(), '.brain', 'improvement-requests.md');
|
|
9
|
+
const STATE_FILE = path.join(os.homedir(), '.brain', '.improvement-hook-state');
|
|
10
|
+
function readStdin() {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
let data = '';
|
|
13
|
+
process.stdin.setEncoding('utf8');
|
|
14
|
+
process.stdin.on('data', (chunk) => { data += chunk; });
|
|
15
|
+
process.stdin.on('end', () => resolve(data));
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function getLastSeenSize() {
|
|
19
|
+
try {
|
|
20
|
+
const state = fs.readFileSync(STATE_FILE, 'utf-8').trim();
|
|
21
|
+
return parseInt(state, 10) || 0;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function saveSeenSize(size) {
|
|
28
|
+
try {
|
|
29
|
+
fs.mkdirSync(path.dirname(STATE_FILE), { recursive: true });
|
|
30
|
+
fs.writeFileSync(STATE_FILE, String(size));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// best effort
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function main() {
|
|
37
|
+
await readStdin(); // consume stdin (required by hook protocol)
|
|
38
|
+
if (!fs.existsSync(IMPROVEMENTS_FILE))
|
|
39
|
+
return;
|
|
40
|
+
let content;
|
|
41
|
+
try {
|
|
42
|
+
content = fs.readFileSync(IMPROVEMENTS_FILE, 'utf-8');
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const currentSize = content.length;
|
|
48
|
+
const lastSeenSize = getLastSeenSize();
|
|
49
|
+
// File was rewritten/shrunk — reset state and scan from beginning
|
|
50
|
+
if (currentSize < lastSeenSize) {
|
|
51
|
+
saveSeenSize(0);
|
|
52
|
+
}
|
|
53
|
+
// No new content since last check
|
|
54
|
+
if (currentSize <= lastSeenSize)
|
|
55
|
+
return;
|
|
56
|
+
// Extract only the new part (or full content if file was reset)
|
|
57
|
+
const effectiveLastSeen = currentSize < lastSeenSize ? 0 : lastSeenSize;
|
|
58
|
+
const newContent = content.slice(effectiveLastSeen).trim();
|
|
59
|
+
if (!newContent)
|
|
60
|
+
return;
|
|
61
|
+
// Extract "Tell Claude:" lines from new content
|
|
62
|
+
const suggestions = newContent
|
|
63
|
+
.split('\n')
|
|
64
|
+
.filter(line => line.includes('Tell Claude:'))
|
|
65
|
+
.map(line => line.replace(/^\d+\.\s*/, '').replace('Tell Claude: ', '').trim())
|
|
66
|
+
.filter(Boolean);
|
|
67
|
+
if (suggestions.length === 0) {
|
|
68
|
+
// Still update state even if no actionable suggestions
|
|
69
|
+
saveSeenSize(currentSize);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Deduplicate
|
|
73
|
+
const unique = [...new Set(suggestions)];
|
|
74
|
+
// Output to stdout — this gets injected into Claude's context
|
|
75
|
+
console.log(`🧠 Brain Self-Improvement Request (${unique.length} new suggestion${unique.length > 1 ? 's' : ''}):`);
|
|
76
|
+
for (const s of unique) {
|
|
77
|
+
console.log(` → ${s}`);
|
|
78
|
+
}
|
|
79
|
+
// Update state
|
|
80
|
+
saveSeenSize(currentSize);
|
|
81
|
+
}
|
|
82
|
+
main();
|
|
83
|
+
//# sourceMappingURL=prompt-submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/prompt-submit.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED