@timmeck/brain 1.0.0 → 1.1.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/BRAIN_PLAN.md +3324 -3324
- package/LICENSE +21 -21
- package/README.md +194 -188
- package/dist/brain.js +2 -0
- package/dist/brain.js.map +1 -1
- package/dist/cli/colors.d.ts +50 -0
- package/dist/cli/colors.js +106 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +165 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/dashboard.js +222 -8
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/export.js +3 -0
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/import.js +24 -15
- package/dist/cli/commands/import.js.map +1 -1
- package/dist/cli/commands/insights.js +33 -6
- package/dist/cli/commands/insights.js.map +1 -1
- package/dist/cli/commands/learn.d.ts +2 -0
- package/dist/cli/commands/learn.js +22 -0
- package/dist/cli/commands/learn.js.map +1 -0
- package/dist/cli/commands/modules.js +25 -6
- package/dist/cli/commands/modules.js.map +1 -1
- package/dist/cli/commands/network.js +15 -9
- package/dist/cli/commands/network.js.map +1 -1
- package/dist/cli/commands/query.js +92 -25
- package/dist/cli/commands/query.js.map +1 -1
- package/dist/cli/commands/start.js +5 -4
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.js +19 -16
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.js +5 -4
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/ipc-helper.js +4 -3
- package/dist/cli/ipc-helper.js.map +1 -1
- package/dist/db/migrations/001_core_schema.js +115 -115
- package/dist/db/migrations/002_learning_schema.js +33 -33
- package/dist/db/migrations/003_code_schema.js +48 -48
- package/dist/db/migrations/004_synapses_schema.js +52 -52
- package/dist/db/migrations/005_fts_indexes.js +73 -73
- package/dist/db/migrations/index.js +6 -6
- package/dist/db/repositories/antipattern.repository.js +3 -3
- package/dist/db/repositories/code-module.repository.d.ts +1 -0
- package/dist/db/repositories/code-module.repository.js +8 -0
- package/dist/db/repositories/code-module.repository.js.map +1 -1
- package/dist/db/repositories/error.repository.js +46 -46
- package/dist/db/repositories/insight.repository.js +3 -3
- package/dist/db/repositories/notification.repository.js +3 -3
- package/dist/db/repositories/project.repository.js +21 -21
- package/dist/db/repositories/rule.repository.js +24 -24
- package/dist/db/repositories/solution.repository.js +50 -50
- package/dist/db/repositories/synapse.repository.js +18 -18
- package/dist/db/repositories/terminal.repository.js +24 -24
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/ipc/router.d.ts +2 -0
- package/dist/ipc/router.js +7 -1
- package/dist/ipc/router.js.map +1 -1
- package/dist/services/code.service.d.ts +1 -1
- package/dist/services/code.service.js +5 -2
- package/dist/services/code.service.js.map +1 -1
- package/package.json +5 -4
- package/src/brain.ts +3 -0
- package/src/cli/colors.ts +116 -0
- package/src/cli/commands/config.ts +169 -0
- package/src/cli/commands/dashboard.ts +231 -8
- package/src/cli/commands/export.ts +4 -0
- package/src/cli/commands/import.ts +24 -15
- package/src/cli/commands/insights.ts +37 -5
- package/src/cli/commands/learn.ts +24 -0
- package/src/cli/commands/modules.ts +28 -5
- package/src/cli/commands/network.ts +15 -9
- package/src/cli/commands/query.ts +103 -26
- package/src/cli/commands/start.ts +5 -4
- package/src/cli/commands/status.ts +19 -16
- package/src/cli/commands/stop.ts +5 -4
- package/src/cli/ipc-helper.ts +4 -3
- package/src/code/analyzer.ts +77 -77
- package/src/code/fingerprint.ts +87 -87
- package/src/code/matcher.ts +64 -64
- package/src/code/parsers/generic.ts +29 -29
- package/src/code/parsers/python.ts +54 -54
- package/src/code/parsers/typescript.ts +65 -65
- package/src/code/registry.ts +60 -60
- package/src/code/scorer.ts +108 -108
- package/src/config.ts +111 -111
- package/src/db/connection.ts +22 -22
- package/src/db/migrations/001_core_schema.ts +120 -120
- package/src/db/migrations/002_learning_schema.ts +38 -38
- package/src/db/migrations/003_code_schema.ts +53 -53
- package/src/db/migrations/004_synapses_schema.ts +57 -57
- package/src/db/migrations/005_fts_indexes.ts +78 -78
- package/src/db/migrations/006_synapses_phase3.ts +17 -17
- package/src/db/migrations/index.ts +64 -64
- package/src/db/repositories/antipattern.repository.ts +66 -66
- package/src/db/repositories/code-module.repository.ts +9 -0
- package/src/db/repositories/error.repository.ts +149 -149
- package/src/db/repositories/insight.repository.ts +78 -78
- package/src/db/repositories/notification.repository.ts +66 -66
- package/src/db/repositories/project.repository.ts +93 -93
- package/src/db/repositories/rule.repository.ts +108 -108
- package/src/db/repositories/solution.repository.ts +154 -154
- package/src/db/repositories/synapse.repository.ts +153 -153
- package/src/db/repositories/terminal.repository.ts +101 -101
- package/src/hooks/post-tool-use.ts +90 -90
- package/src/hooks/post-write.ts +117 -117
- package/src/index.ts +4 -0
- package/src/ipc/client.ts +118 -118
- package/src/ipc/protocol.ts +35 -35
- package/src/ipc/router.ts +9 -1
- package/src/ipc/server.ts +110 -110
- package/src/learning/confidence-scorer.ts +47 -47
- package/src/learning/decay.ts +46 -46
- package/src/learning/learning-engine.ts +162 -162
- package/src/learning/pattern-extractor.ts +90 -90
- package/src/learning/rule-generator.ts +74 -74
- package/src/matching/error-matcher.ts +115 -115
- package/src/matching/fingerprint.ts +29 -29
- package/src/matching/similarity.ts +61 -61
- package/src/matching/tfidf.ts +74 -74
- package/src/matching/tokenizer.ts +41 -41
- package/src/mcp/auto-detect.ts +93 -93
- package/src/mcp/server.ts +73 -73
- package/src/mcp/tools.ts +290 -290
- package/src/parsing/error-parser.ts +28 -28
- package/src/parsing/parsers/compiler.ts +93 -93
- package/src/parsing/parsers/generic.ts +28 -28
- package/src/parsing/parsers/go.ts +97 -97
- package/src/parsing/parsers/node.ts +69 -69
- package/src/parsing/parsers/python.ts +62 -62
- package/src/parsing/parsers/rust.ts +50 -50
- package/src/parsing/parsers/shell.ts +42 -42
- package/src/parsing/types.ts +47 -47
- package/src/research/gap-analyzer.ts +135 -135
- package/src/research/insight-generator.ts +123 -123
- package/src/research/research-engine.ts +116 -116
- package/src/research/synergy-detector.ts +126 -126
- package/src/research/template-extractor.ts +130 -130
- package/src/research/trend-analyzer.ts +127 -127
- package/src/services/analytics.service.ts +87 -87
- package/src/services/code.service.ts +5 -2
- package/src/services/error.service.ts +164 -164
- package/src/services/notification.service.ts +41 -41
- package/src/services/prevention.service.ts +119 -119
- package/src/services/research.service.ts +93 -93
- package/src/services/solution.service.ts +116 -116
- package/src/services/synapse.service.ts +59 -59
- package/src/services/terminal.service.ts +81 -81
- package/src/synapses/activation.ts +80 -80
- package/src/synapses/decay.ts +38 -38
- package/src/synapses/hebbian.ts +69 -69
- package/src/synapses/pathfinder.ts +81 -81
- package/src/synapses/synapse-manager.ts +109 -109
- package/src/types/code.types.ts +52 -52
- package/src/types/config.types.ts +79 -79
- package/src/types/error.types.ts +67 -67
- package/src/types/ipc.types.ts +8 -8
- package/src/types/mcp.types.ts +53 -53
- package/src/types/research.types.ts +28 -28
- package/src/types/solution.types.ts +30 -30
- package/src/types/synapse.types.ts +49 -49
- package/src/utils/events.ts +45 -45
- package/src/utils/hash.ts +5 -5
- package/src/utils/logger.ts +48 -48
- package/src/utils/paths.ts +19 -19
- package/tests/fixtures/code-modules/modules.ts +83 -83
- package/tests/fixtures/errors/go.ts +9 -9
- package/tests/fixtures/errors/node.ts +24 -24
- package/tests/fixtures/errors/python.ts +21 -21
- package/tests/fixtures/errors/rust.ts +25 -25
- package/tests/fixtures/errors/shell.ts +15 -15
- package/tests/fixtures/solutions/solutions.ts +27 -27
- package/tests/helpers/setup-db.ts +52 -52
- package/tests/integration/code-flow.test.ts +86 -86
- package/tests/integration/error-flow.test.ts +83 -83
- package/tests/integration/ipc-flow.test.ts +166 -166
- package/tests/integration/learning-cycle.test.ts +82 -82
- package/tests/integration/synapse-flow.test.ts +117 -117
- package/tests/unit/code/analyzer.test.ts +58 -58
- package/tests/unit/code/fingerprint.test.ts +51 -51
- package/tests/unit/code/scorer.test.ts +55 -55
- package/tests/unit/learning/confidence-scorer.test.ts +60 -60
- package/tests/unit/learning/decay.test.ts +45 -45
- package/tests/unit/learning/pattern-extractor.test.ts +50 -50
- package/tests/unit/matching/error-matcher.test.ts +69 -69
- package/tests/unit/matching/fingerprint.test.ts +47 -47
- package/tests/unit/matching/similarity.test.ts +65 -65
- package/tests/unit/matching/tfidf.test.ts +71 -71
- package/tests/unit/matching/tokenizer.test.ts +83 -83
- package/tests/unit/parsing/parsers.test.ts +113 -113
- package/tests/unit/research/gap-analyzer.test.ts +45 -45
- package/tests/unit/research/trend-analyzer.test.ts +45 -45
- package/tests/unit/synapses/activation.test.ts +80 -80
- package/tests/unit/synapses/decay.test.ts +27 -27
- package/tests/unit/synapses/hebbian.test.ts +96 -96
- package/tests/unit/synapses/pathfinder.test.ts +72 -72
- package/tsconfig.json +18 -18
|
@@ -4,32 +4,32 @@ export class SynapseRepository {
|
|
|
4
4
|
constructor(db) {
|
|
5
5
|
this.db = db;
|
|
6
6
|
this.stmts = {
|
|
7
|
-
create: db.prepare(`
|
|
8
|
-
INSERT INTO synapses (source_type, source_id, target_type, target_id, synapse_type, weight, metadata)
|
|
9
|
-
VALUES (@source_type, @source_id, @target_type, @target_id, @synapse_type, @weight, @metadata)
|
|
7
|
+
create: db.prepare(`
|
|
8
|
+
INSERT INTO synapses (source_type, source_id, target_type, target_id, synapse_type, weight, metadata)
|
|
9
|
+
VALUES (@source_type, @source_id, @target_type, @target_id, @synapse_type, @weight, @metadata)
|
|
10
10
|
`),
|
|
11
11
|
getById: db.prepare('SELECT * FROM synapses WHERE id = ?'),
|
|
12
12
|
delete: db.prepare('DELETE FROM synapses WHERE id = ?'),
|
|
13
13
|
getOutgoing: db.prepare('SELECT * FROM synapses WHERE source_type = ? AND source_id = ? ORDER BY weight DESC'),
|
|
14
14
|
getIncoming: db.prepare('SELECT * FROM synapses WHERE target_type = ? AND target_id = ? ORDER BY weight DESC'),
|
|
15
|
-
findConnected: db.prepare(`
|
|
16
|
-
SELECT * FROM synapses
|
|
17
|
-
WHERE (source_type = ? AND source_id = ?) OR (target_type = ? AND target_id = ?)
|
|
18
|
-
ORDER BY weight DESC
|
|
15
|
+
findConnected: db.prepare(`
|
|
16
|
+
SELECT * FROM synapses
|
|
17
|
+
WHERE (source_type = ? AND source_id = ?) OR (target_type = ? AND target_id = ?)
|
|
18
|
+
ORDER BY weight DESC
|
|
19
19
|
`),
|
|
20
|
-
findBySourceTarget: db.prepare(`
|
|
21
|
-
SELECT * FROM synapses
|
|
22
|
-
WHERE source_type = ? AND source_id = ? AND target_type = ? AND target_id = ? AND synapse_type = ?
|
|
20
|
+
findBySourceTarget: db.prepare(`
|
|
21
|
+
SELECT * FROM synapses
|
|
22
|
+
WHERE source_type = ? AND source_id = ? AND target_type = ? AND target_id = ? AND synapse_type = ?
|
|
23
23
|
`),
|
|
24
|
-
findInactiveSince: db.prepare(`
|
|
25
|
-
SELECT * FROM synapses WHERE last_activated_at < ?
|
|
24
|
+
findInactiveSince: db.prepare(`
|
|
25
|
+
SELECT * FROM synapses WHERE last_activated_at < ?
|
|
26
26
|
`),
|
|
27
|
-
countNodes: db.prepare(`
|
|
28
|
-
SELECT COUNT(*) as count FROM (
|
|
29
|
-
SELECT source_type, source_id FROM synapses
|
|
30
|
-
UNION
|
|
31
|
-
SELECT target_type, target_id FROM synapses
|
|
32
|
-
)
|
|
27
|
+
countNodes: db.prepare(`
|
|
28
|
+
SELECT COUNT(*) as count FROM (
|
|
29
|
+
SELECT source_type, source_id FROM synapses
|
|
30
|
+
UNION
|
|
31
|
+
SELECT target_type, target_id FROM synapses
|
|
32
|
+
)
|
|
33
33
|
`),
|
|
34
34
|
avgWeight: db.prepare('SELECT AVG(weight) as avg_weight FROM synapses'),
|
|
35
35
|
countByType: db.prepare('SELECT synapse_type, COUNT(*) as count FROM synapses GROUP BY synapse_type'),
|
|
@@ -4,36 +4,36 @@ export class TerminalRepository {
|
|
|
4
4
|
constructor(db) {
|
|
5
5
|
this.db = db;
|
|
6
6
|
this.stmts = {
|
|
7
|
-
create: this.db.prepare(`
|
|
8
|
-
INSERT INTO terminals (uuid, project_id, pid, shell, cwd)
|
|
9
|
-
VALUES (@uuid, @project_id, @pid, @shell, @cwd)
|
|
7
|
+
create: this.db.prepare(`
|
|
8
|
+
INSERT INTO terminals (uuid, project_id, pid, shell, cwd)
|
|
9
|
+
VALUES (@uuid, @project_id, @pid, @shell, @cwd)
|
|
10
10
|
`),
|
|
11
|
-
getById: this.db.prepare(`
|
|
12
|
-
SELECT * FROM terminals WHERE id = ?
|
|
11
|
+
getById: this.db.prepare(`
|
|
12
|
+
SELECT * FROM terminals WHERE id = ?
|
|
13
13
|
`),
|
|
14
|
-
update: this.db.prepare(`
|
|
15
|
-
UPDATE terminals
|
|
16
|
-
SET project_id = COALESCE(@project_id, project_id),
|
|
17
|
-
pid = COALESCE(@pid, pid),
|
|
18
|
-
shell = COALESCE(@shell, shell),
|
|
19
|
-
cwd = COALESCE(@cwd, cwd),
|
|
20
|
-
last_seen = COALESCE(@last_seen, last_seen),
|
|
21
|
-
disconnected_at = COALESCE(@disconnected_at, disconnected_at)
|
|
22
|
-
WHERE id = @id
|
|
14
|
+
update: this.db.prepare(`
|
|
15
|
+
UPDATE terminals
|
|
16
|
+
SET project_id = COALESCE(@project_id, project_id),
|
|
17
|
+
pid = COALESCE(@pid, pid),
|
|
18
|
+
shell = COALESCE(@shell, shell),
|
|
19
|
+
cwd = COALESCE(@cwd, cwd),
|
|
20
|
+
last_seen = COALESCE(@last_seen, last_seen),
|
|
21
|
+
disconnected_at = COALESCE(@disconnected_at, disconnected_at)
|
|
22
|
+
WHERE id = @id
|
|
23
23
|
`),
|
|
24
|
-
delete: this.db.prepare(`
|
|
25
|
-
DELETE FROM terminals WHERE id = ?
|
|
24
|
+
delete: this.db.prepare(`
|
|
25
|
+
DELETE FROM terminals WHERE id = ?
|
|
26
26
|
`),
|
|
27
|
-
findByUuid: this.db.prepare(`
|
|
28
|
-
SELECT * FROM terminals WHERE uuid = ?
|
|
27
|
+
findByUuid: this.db.prepare(`
|
|
28
|
+
SELECT * FROM terminals WHERE uuid = ?
|
|
29
29
|
`),
|
|
30
|
-
findConnected: this.db.prepare(`
|
|
31
|
-
SELECT * FROM terminals WHERE disconnected_at IS NULL ORDER BY connected_at DESC
|
|
30
|
+
findConnected: this.db.prepare(`
|
|
31
|
+
SELECT * FROM terminals WHERE disconnected_at IS NULL ORDER BY connected_at DESC
|
|
32
32
|
`),
|
|
33
|
-
cleanupStale: this.db.prepare(`
|
|
34
|
-
UPDATE terminals
|
|
35
|
-
SET disconnected_at = datetime('now')
|
|
36
|
-
WHERE disconnected_at IS NULL AND last_seen < ?
|
|
33
|
+
cleanupStale: this.db.prepare(`
|
|
34
|
+
UPDATE terminals
|
|
35
|
+
SET disconnected_at = datetime('now')
|
|
36
|
+
WHERE disconnected_at IS NULL AND last_seen < ?
|
|
37
37
|
`),
|
|
38
38
|
};
|
|
39
39
|
}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,8 @@ import { networkCommand } from './cli/commands/network.js';
|
|
|
10
10
|
import { exportCommand } from './cli/commands/export.js';
|
|
11
11
|
import { importCommand } from './cli/commands/import.js';
|
|
12
12
|
import { dashboardCommand } from './cli/commands/dashboard.js';
|
|
13
|
+
import { learnCommand } from './cli/commands/learn.js';
|
|
14
|
+
import { configCommand } from './cli/commands/config.js';
|
|
13
15
|
const program = new Command();
|
|
14
16
|
program
|
|
15
17
|
.name('brain')
|
|
@@ -25,6 +27,8 @@ program.addCommand(networkCommand());
|
|
|
25
27
|
program.addCommand(exportCommand());
|
|
26
28
|
program.addCommand(importCommand());
|
|
27
29
|
program.addCommand(dashboardCommand());
|
|
30
|
+
program.addCommand(learnCommand());
|
|
31
|
+
program.addCommand(configCommand());
|
|
28
32
|
// Hidden command: run MCP server (called by Claude Code)
|
|
29
33
|
program
|
|
30
34
|
.command('mcp-server')
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AAEpC,yDAAyD;AACzD,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,qEAAqE;AACrE,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/ipc/router.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type { SynapseService } from '../services/synapse.service.js';
|
|
|
7
7
|
import type { ResearchService } from '../services/research.service.js';
|
|
8
8
|
import type { NotificationService } from '../services/notification.service.js';
|
|
9
9
|
import type { AnalyticsService } from '../services/analytics.service.js';
|
|
10
|
+
import type { LearningEngine } from '../learning/learning-engine.js';
|
|
10
11
|
export interface Services {
|
|
11
12
|
error: ErrorService;
|
|
12
13
|
solution: SolutionService;
|
|
@@ -17,6 +18,7 @@ export interface Services {
|
|
|
17
18
|
research: ResearchService;
|
|
18
19
|
notification: NotificationService;
|
|
19
20
|
analytics: AnalyticsService;
|
|
21
|
+
learning?: LearningEngine;
|
|
20
22
|
}
|
|
21
23
|
export declare class IpcRouter {
|
|
22
24
|
private services;
|
package/dist/ipc/router.js
CHANGED
|
@@ -44,7 +44,7 @@ export class IpcRouter {
|
|
|
44
44
|
['code.analyze', (params) => s.code.analyzeAndRegister(p(params))],
|
|
45
45
|
['code.find', (params) => s.code.findReusable(p(params))],
|
|
46
46
|
['code.similarity', (params) => s.code.checkSimilarity(p(params).source, p(params).language)],
|
|
47
|
-
['code.modules', (params) => s.code.listModules(p(params)?.projectId)],
|
|
47
|
+
['code.modules', (params) => s.code.listModules(p(params)?.projectId, p(params)?.language, p(params)?.limit)],
|
|
48
48
|
['code.get', (params) => s.code.getById(p(params).id)],
|
|
49
49
|
// Prevention
|
|
50
50
|
['prevention.check', (params) => s.prevention.checkRules(p(params).errorType, p(params).message, p(params).projectId)],
|
|
@@ -64,6 +64,12 @@ export class IpcRouter {
|
|
|
64
64
|
// Analytics
|
|
65
65
|
['analytics.summary', (params) => s.analytics.getSummary(p(params)?.projectId)],
|
|
66
66
|
['analytics.network', (params) => s.analytics.getNetworkOverview(p(params)?.limit)],
|
|
67
|
+
// Learning
|
|
68
|
+
['learning.run', () => {
|
|
69
|
+
if (!s.learning)
|
|
70
|
+
throw new Error('Learning engine not available');
|
|
71
|
+
return s.learning.runCycle();
|
|
72
|
+
}],
|
|
67
73
|
]);
|
|
68
74
|
}
|
|
69
75
|
}
|
package/dist/ipc/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/ipc/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/ipc/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,6 @@ export declare class CodeService {
|
|
|
34
34
|
score: number;
|
|
35
35
|
matchType: string;
|
|
36
36
|
}>;
|
|
37
|
-
listModules(projectId?: number): CodeModuleRecord[];
|
|
37
|
+
listModules(projectId?: number, language?: string, limit?: number): CodeModuleRecord[];
|
|
38
38
|
getById(id: number): CodeModuleRecord | undefined;
|
|
39
39
|
}
|
|
@@ -85,11 +85,14 @@ export class CodeService {
|
|
|
85
85
|
return exact;
|
|
86
86
|
return findSemanticMatches(source, allModules, 0.5);
|
|
87
87
|
}
|
|
88
|
-
listModules(projectId) {
|
|
88
|
+
listModules(projectId, language, limit) {
|
|
89
89
|
if (projectId) {
|
|
90
90
|
return this.codeModuleRepo.findByProject(projectId);
|
|
91
91
|
}
|
|
92
|
-
|
|
92
|
+
if (language) {
|
|
93
|
+
return this.codeModuleRepo.findByLanguage(language, limit);
|
|
94
|
+
}
|
|
95
|
+
return this.codeModuleRepo.findAll(limit);
|
|
93
96
|
}
|
|
94
97
|
getById(id) {
|
|
95
98
|
return this.codeModuleRepo.getById(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code.service.js","sourceRoot":"","sources":["../../src/services/code.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"code.service.js","sourceRoot":"","sources":["../../src/services/code.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@timmeck/brain",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Adaptive error memory and code intelligence system with Hebbian synapse network for Claude Code",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,16 +28,17 @@
|
|
|
28
28
|
"url": "https://github.com/timmeck/brain"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"better-sqlite3": "^11.7.0",
|
|
32
31
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
32
|
+
"better-sqlite3": "^11.7.0",
|
|
33
|
+
"chalk": "^5.6.2",
|
|
33
34
|
"commander": "^13.0.0",
|
|
34
35
|
"winston": "^3.17.0"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
37
|
-
"typescript": "^5.7.0",
|
|
38
|
-
"@types/node": "^22.0.0",
|
|
39
38
|
"@types/better-sqlite3": "^7.6.12",
|
|
39
|
+
"@types/node": "^22.0.0",
|
|
40
40
|
"tsx": "^4.19.0",
|
|
41
|
+
"typescript": "^5.7.0",
|
|
41
42
|
"vitest": "^3.0.0"
|
|
42
43
|
}
|
|
43
44
|
}
|
package/src/brain.ts
CHANGED
|
@@ -120,6 +120,9 @@ export class BrainCore {
|
|
|
120
120
|
this.researchEngine.start();
|
|
121
121
|
logger.info(`Research engine started (interval: ${config.research.intervalMs}ms)`);
|
|
122
122
|
|
|
123
|
+
// Expose learning engine to IPC
|
|
124
|
+
services.learning = this.learningEngine;
|
|
125
|
+
|
|
123
126
|
// 10. IPC Server
|
|
124
127
|
const router = new IpcRouter(services);
|
|
125
128
|
this.ipcServer = new IpcServer(router, config.ipc.pipeName);
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
|
|
3
|
+
// Brand colors matching the dashboard
|
|
4
|
+
export const c = {
|
|
5
|
+
// Primary palette
|
|
6
|
+
blue: chalk.hex('#5b9cff'),
|
|
7
|
+
purple: chalk.hex('#b47aff'),
|
|
8
|
+
cyan: chalk.hex('#47e5ff'),
|
|
9
|
+
green: chalk.hex('#3dffa0'),
|
|
10
|
+
red: chalk.hex('#ff5577'),
|
|
11
|
+
orange: chalk.hex('#ffb347'),
|
|
12
|
+
dim: chalk.hex('#8b8fb0'),
|
|
13
|
+
dimmer: chalk.hex('#4a4d6e'),
|
|
14
|
+
|
|
15
|
+
// Semantic
|
|
16
|
+
label: chalk.hex('#8b8fb0'),
|
|
17
|
+
value: chalk.white.bold,
|
|
18
|
+
heading: chalk.hex('#5b9cff').bold,
|
|
19
|
+
success: chalk.hex('#3dffa0').bold,
|
|
20
|
+
error: chalk.hex('#ff5577').bold,
|
|
21
|
+
warn: chalk.hex('#ffb347').bold,
|
|
22
|
+
info: chalk.hex('#47e5ff'),
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const icons = {
|
|
26
|
+
brain: '🧠',
|
|
27
|
+
check: '✓',
|
|
28
|
+
cross: '✗',
|
|
29
|
+
arrow: '→',
|
|
30
|
+
dot: '●',
|
|
31
|
+
circle: '○',
|
|
32
|
+
bar: '█',
|
|
33
|
+
barLight: '░',
|
|
34
|
+
dash: '─',
|
|
35
|
+
pipe: '│',
|
|
36
|
+
corner: '└',
|
|
37
|
+
tee: '├',
|
|
38
|
+
star: '★',
|
|
39
|
+
bolt: '⚡',
|
|
40
|
+
search: '🔍',
|
|
41
|
+
gear: '⚙',
|
|
42
|
+
chart: '📊',
|
|
43
|
+
module: '📦',
|
|
44
|
+
synapse: '🔗',
|
|
45
|
+
insight: '💡',
|
|
46
|
+
warn: '⚠',
|
|
47
|
+
error: '❌',
|
|
48
|
+
ok: '✅',
|
|
49
|
+
clock: '⏱',
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export function header(title: string, icon?: string): string {
|
|
53
|
+
const prefix = icon ? `${icon} ` : '';
|
|
54
|
+
const line = c.dimmer(icons.dash.repeat(40));
|
|
55
|
+
return `\n${line}\n${prefix}${c.heading(title)}\n${line}`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function keyValue(key: string, value: string | number, indent = 2): string {
|
|
59
|
+
const pad = ' '.repeat(indent);
|
|
60
|
+
return `${pad}${c.label(key + ':')} ${c.value(String(value))}`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function statusBadge(status: string): string {
|
|
64
|
+
switch (status.toLowerCase()) {
|
|
65
|
+
case 'resolved':
|
|
66
|
+
case 'active':
|
|
67
|
+
case 'running':
|
|
68
|
+
return c.green(`[${status.toUpperCase()}]`);
|
|
69
|
+
case 'open':
|
|
70
|
+
case 'unresolved':
|
|
71
|
+
return c.red(`[${status.toUpperCase()}]`);
|
|
72
|
+
case 'warning':
|
|
73
|
+
return c.warn(`[${status.toUpperCase()}]`);
|
|
74
|
+
default:
|
|
75
|
+
return c.dim(`[${status.toUpperCase()}]`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function priorityBadge(priority: number | string): string {
|
|
80
|
+
const p = typeof priority === 'string' ? priority.toLowerCase() : '';
|
|
81
|
+
const n = typeof priority === 'number' ? priority : 0;
|
|
82
|
+
if (p === 'critical' || n >= 9) return c.red.bold(`[CRITICAL]`);
|
|
83
|
+
if (p === 'high' || n >= 7) return c.orange.bold(`[HIGH]`);
|
|
84
|
+
if (p === 'medium' || n >= 4) return c.blue(`[MEDIUM]`);
|
|
85
|
+
return c.dim(`[LOW]`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function progressBar(current: number, total: number, width = 20): string {
|
|
89
|
+
const pct = Math.min(1, current / Math.max(1, total));
|
|
90
|
+
const filled = Math.round(pct * width);
|
|
91
|
+
const empty = width - filled;
|
|
92
|
+
return c.cyan(icons.bar.repeat(filled)) + c.dimmer(icons.barLight.repeat(empty));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function divider(width = 40): string {
|
|
96
|
+
return c.dimmer(icons.dash.repeat(width));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function table(rows: string[][], colWidths?: number[]): string {
|
|
100
|
+
if (rows.length === 0) return '';
|
|
101
|
+
const widths = colWidths ?? rows[0].map((_, i) =>
|
|
102
|
+
Math.max(...rows.map(r => stripAnsi(r[i] ?? '').length))
|
|
103
|
+
);
|
|
104
|
+
return rows.map(row =>
|
|
105
|
+
row.map((cell, i) => {
|
|
106
|
+
const stripped = stripAnsi(cell);
|
|
107
|
+
const pad = Math.max(0, (widths[i] ?? stripped.length) - stripped.length);
|
|
108
|
+
return cell + ' '.repeat(pad);
|
|
109
|
+
}).join(' ')
|
|
110
|
+
).join('\n');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function stripAnsi(str: string): string {
|
|
114
|
+
// eslint-disable-next-line no-control-regex
|
|
115
|
+
return str.replace(/\x1b\[[0-9;]*m/g, '');
|
|
116
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { getDataDir } from '../../utils/paths.js';
|
|
5
|
+
import { c, icons, header, divider } from '../colors.js';
|
|
6
|
+
|
|
7
|
+
function getConfigPath(): string {
|
|
8
|
+
return path.join(getDataDir(), 'config.json');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function readConfig(): Record<string, unknown> {
|
|
12
|
+
const configPath = getConfigPath();
|
|
13
|
+
if (fs.existsSync(configPath)) {
|
|
14
|
+
return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
15
|
+
}
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function writeConfig(config: Record<string, unknown>): void {
|
|
20
|
+
const configPath = getConfigPath();
|
|
21
|
+
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
22
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getNestedValue(obj: Record<string, unknown>, keyPath: string): unknown {
|
|
26
|
+
const parts = keyPath.split('.');
|
|
27
|
+
let current: unknown = obj;
|
|
28
|
+
for (const part of parts) {
|
|
29
|
+
if (current === null || current === undefined || typeof current !== 'object') return undefined;
|
|
30
|
+
current = (current as Record<string, unknown>)[part];
|
|
31
|
+
}
|
|
32
|
+
return current;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function setNestedValue(obj: Record<string, unknown>, keyPath: string, value: unknown): void {
|
|
36
|
+
const parts = keyPath.split('.');
|
|
37
|
+
let current: Record<string, unknown> = obj;
|
|
38
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
39
|
+
const part = parts[i];
|
|
40
|
+
if (!current[part] || typeof current[part] !== 'object') {
|
|
41
|
+
current[part] = {};
|
|
42
|
+
}
|
|
43
|
+
current = current[part] as Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
current[parts[parts.length - 1]] = value;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function deleteNestedValue(obj: Record<string, unknown>, keyPath: string): boolean {
|
|
49
|
+
const parts = keyPath.split('.');
|
|
50
|
+
let current: Record<string, unknown> = obj;
|
|
51
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
52
|
+
const part = parts[i];
|
|
53
|
+
if (!current[part] || typeof current[part] !== 'object') return false;
|
|
54
|
+
current = current[part] as Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
const last = parts[parts.length - 1];
|
|
57
|
+
if (last in current) {
|
|
58
|
+
delete current[last];
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function parseValue(value: string): unknown {
|
|
65
|
+
if (value === 'true') return true;
|
|
66
|
+
if (value === 'false') return false;
|
|
67
|
+
if (value === 'null') return null;
|
|
68
|
+
const num = Number(value);
|
|
69
|
+
if (!isNaN(num) && value.trim() !== '') return num;
|
|
70
|
+
// Try JSON for arrays/objects
|
|
71
|
+
if ((value.startsWith('[') && value.endsWith(']')) || (value.startsWith('{') && value.endsWith('}'))) {
|
|
72
|
+
try { return JSON.parse(value); } catch { /* fall through */ }
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function printObject(obj: unknown, indent = 0): void {
|
|
78
|
+
const pad = ' '.repeat(indent);
|
|
79
|
+
if (obj === null || obj === undefined) {
|
|
80
|
+
console.log(`${pad}${c.dim('(not set)')}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (typeof obj !== 'object') {
|
|
84
|
+
console.log(`${pad}${c.value(String(obj))}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
for (const [key, val] of Object.entries(obj as Record<string, unknown>)) {
|
|
88
|
+
if (val && typeof val === 'object' && !Array.isArray(val)) {
|
|
89
|
+
console.log(`${pad}${c.cyan(key + ':')}`);
|
|
90
|
+
printObject(val, indent + 2);
|
|
91
|
+
} else {
|
|
92
|
+
const display = Array.isArray(val) ? JSON.stringify(val) : String(val);
|
|
93
|
+
console.log(`${pad}${c.label(key + ':')} ${c.value(display)}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function configCommand(): Command {
|
|
99
|
+
const cmd = new Command('config')
|
|
100
|
+
.description('View and modify Brain configuration');
|
|
101
|
+
|
|
102
|
+
cmd
|
|
103
|
+
.command('show')
|
|
104
|
+
.description('Show current configuration')
|
|
105
|
+
.argument('[key]', 'Specific config key (e.g., learning.intervalMs)')
|
|
106
|
+
.action((key?: string) => {
|
|
107
|
+
const config = readConfig();
|
|
108
|
+
|
|
109
|
+
if (key) {
|
|
110
|
+
const value = getNestedValue(config, key);
|
|
111
|
+
if (value === undefined) {
|
|
112
|
+
console.log(`${c.dim(`Key "${key}" is not set in config overrides.`)}`);
|
|
113
|
+
} else {
|
|
114
|
+
console.log(`${c.label(key + ':')} ${c.value(typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value))}`);
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
console.log(header('Brain Configuration', icons.gear));
|
|
120
|
+
console.log(` ${c.label('Config file:')} ${c.dim(getConfigPath())}\n`);
|
|
121
|
+
|
|
122
|
+
if (Object.keys(config).length === 0) {
|
|
123
|
+
console.log(` ${c.dim('No custom overrides. Using defaults.')}`);
|
|
124
|
+
console.log(` ${c.dim('Set values with:')} ${c.cyan('brain config set <key> <value>')}`);
|
|
125
|
+
} else {
|
|
126
|
+
printObject(config, 2);
|
|
127
|
+
}
|
|
128
|
+
console.log(`\n${divider()}`);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
cmd
|
|
132
|
+
.command('set')
|
|
133
|
+
.description('Set a configuration value')
|
|
134
|
+
.argument('<key>', 'Config key path (e.g., learning.intervalMs)')
|
|
135
|
+
.argument('<value>', 'Value to set')
|
|
136
|
+
.action((key: string, value: string) => {
|
|
137
|
+
const config = readConfig();
|
|
138
|
+
const parsed = parseValue(value);
|
|
139
|
+
setNestedValue(config, key, parsed);
|
|
140
|
+
writeConfig(config);
|
|
141
|
+
|
|
142
|
+
console.log(`${icons.ok} ${c.label(key)} ${c.dim(icons.arrow)} ${c.value(String(parsed))}`);
|
|
143
|
+
console.log(` ${c.dim('Restart the daemon for changes to take effect:')} ${c.cyan('brain stop && brain start')}`);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
cmd
|
|
147
|
+
.command('delete')
|
|
148
|
+
.description('Remove a configuration override (revert to default)')
|
|
149
|
+
.argument('<key>', 'Config key path to remove')
|
|
150
|
+
.action((key: string) => {
|
|
151
|
+
const config = readConfig();
|
|
152
|
+
if (deleteNestedValue(config, key)) {
|
|
153
|
+
writeConfig(config);
|
|
154
|
+
console.log(`${icons.ok} ${c.dim(`Removed "${key}" — will use default value.`)}`);
|
|
155
|
+
console.log(` ${c.dim('Restart the daemon for changes to take effect:')} ${c.cyan('brain stop && brain start')}`);
|
|
156
|
+
} else {
|
|
157
|
+
console.log(`${c.dim(`Key "${key}" not found in config overrides.`)}`);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
cmd
|
|
162
|
+
.command('path')
|
|
163
|
+
.description('Show the config file path')
|
|
164
|
+
.action(() => {
|
|
165
|
+
console.log(getConfigPath());
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
return cmd;
|
|
169
|
+
}
|