@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,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -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":";AAEA,6FAA6F;AAC7F,gGAAgG;AAChG,2EAA2E;AAE3E,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC;AACvF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC;AAEhF,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,EAAE,CAAC,CAAC,4CAA4C;IAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO;IAE9C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IACnC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IAEvC,kEAAkE;IAClE,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC;QAC/B,YAAY,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kCAAkC;IAClC,IAAI,WAAW,IAAI,YAAY;QAAE,OAAO;IAExC,gEAAgE;IAChE,MAAM,iBAAiB,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACxE,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,gDAAgD;IAChD,MAAM,WAAW,GAAG,UAAU;SAC3B,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;SAC7C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SAC9E,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,uDAAuD;QACvD,YAAY,CAAC,WAAW,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,cAAc;IACd,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAEzC,8DAA8D;IAC9D,OAAO,CAAC,GAAG,CAAC,sCAAsC,MAAM,CAAC,MAAM,kBAAkB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnH,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,eAAe;IACf,YAAY,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC;AAED,IAAI,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timmeck/brain",
3
- "version": "3.14.1",
3
+ "version": "3.15.0",
4
4
  "description": "Adaptive error memory and code intelligence system with Hebbian synapse network, hybrid search, and REST API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",