@timmeck/brain 1.2.0 → 1.8.1

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.
Files changed (131) hide show
  1. package/README.md +225 -50
  2. package/dist/api/server.d.ts +23 -0
  3. package/dist/api/server.js +354 -0
  4. package/dist/api/server.js.map +1 -0
  5. package/dist/brain.d.ts +3 -0
  6. package/dist/brain.js +46 -8
  7. package/dist/brain.js.map +1 -1
  8. package/dist/cli/commands/dashboard.js +37 -1
  9. package/dist/cli/commands/dashboard.js.map +1 -1
  10. package/dist/cli/commands/explain.d.ts +2 -0
  11. package/dist/cli/commands/explain.js +76 -0
  12. package/dist/cli/commands/explain.js.map +1 -0
  13. package/dist/code/analyzer.d.ts +6 -0
  14. package/dist/code/analyzer.js +35 -0
  15. package/dist/code/analyzer.js.map +1 -1
  16. package/dist/code/matcher.d.ts +11 -1
  17. package/dist/code/matcher.js +49 -0
  18. package/dist/code/matcher.js.map +1 -1
  19. package/dist/code/scorer.d.ts +1 -0
  20. package/dist/code/scorer.js +15 -1
  21. package/dist/code/scorer.js.map +1 -1
  22. package/dist/config.js +31 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/dashboard/server.d.ts +15 -0
  25. package/dist/dashboard/server.js +124 -0
  26. package/dist/dashboard/server.js.map +1 -0
  27. package/dist/db/migrations/007_feedback.d.ts +2 -0
  28. package/dist/db/migrations/007_feedback.js +12 -0
  29. package/dist/db/migrations/007_feedback.js.map +1 -0
  30. package/dist/db/migrations/008_git_integration.d.ts +2 -0
  31. package/dist/db/migrations/008_git_integration.js +37 -0
  32. package/dist/db/migrations/008_git_integration.js.map +1 -0
  33. package/dist/db/migrations/009_embeddings.d.ts +2 -0
  34. package/dist/db/migrations/009_embeddings.js +7 -0
  35. package/dist/db/migrations/009_embeddings.js.map +1 -0
  36. package/dist/db/migrations/index.js +6 -0
  37. package/dist/db/migrations/index.js.map +1 -1
  38. package/dist/db/repositories/code-module.repository.d.ts +16 -0
  39. package/dist/db/repositories/code-module.repository.js +42 -0
  40. package/dist/db/repositories/code-module.repository.js.map +1 -1
  41. package/dist/db/repositories/error.repository.d.ts +5 -0
  42. package/dist/db/repositories/error.repository.js +27 -0
  43. package/dist/db/repositories/error.repository.js.map +1 -1
  44. package/dist/db/repositories/insight.repository.d.ts +2 -0
  45. package/dist/db/repositories/insight.repository.js +13 -0
  46. package/dist/db/repositories/insight.repository.js.map +1 -1
  47. package/dist/embeddings/engine.d.ts +42 -0
  48. package/dist/embeddings/engine.js +179 -0
  49. package/dist/embeddings/engine.js.map +1 -0
  50. package/dist/hooks/post-tool-use.js +2 -0
  51. package/dist/hooks/post-tool-use.js.map +1 -1
  52. package/dist/hooks/post-write.js +11 -0
  53. package/dist/hooks/post-write.js.map +1 -1
  54. package/dist/index.js +3 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/ipc/router.d.ts +2 -0
  57. package/dist/ipc/router.js +13 -0
  58. package/dist/ipc/router.js.map +1 -1
  59. package/dist/learning/confidence-scorer.d.ts +16 -0
  60. package/dist/learning/confidence-scorer.js +20 -0
  61. package/dist/learning/confidence-scorer.js.map +1 -1
  62. package/dist/learning/learning-engine.js +12 -5
  63. package/dist/learning/learning-engine.js.map +1 -1
  64. package/dist/matching/error-matcher.d.ts +9 -1
  65. package/dist/matching/error-matcher.js +50 -5
  66. package/dist/matching/error-matcher.js.map +1 -1
  67. package/dist/mcp/http-server.d.ts +14 -0
  68. package/dist/mcp/http-server.js +123 -0
  69. package/dist/mcp/http-server.js.map +1 -0
  70. package/dist/mcp/tools.d.ts +4 -0
  71. package/dist/mcp/tools.js +41 -14
  72. package/dist/mcp/tools.js.map +1 -1
  73. package/dist/services/analytics.service.d.ts +39 -0
  74. package/dist/services/analytics.service.js +111 -0
  75. package/dist/services/analytics.service.js.map +1 -1
  76. package/dist/services/code.service.d.ts +5 -0
  77. package/dist/services/code.service.js +91 -4
  78. package/dist/services/code.service.js.map +1 -1
  79. package/dist/services/error.service.d.ts +17 -1
  80. package/dist/services/error.service.js +90 -12
  81. package/dist/services/error.service.js.map +1 -1
  82. package/dist/services/git.service.d.ts +49 -0
  83. package/dist/services/git.service.js +112 -0
  84. package/dist/services/git.service.js.map +1 -0
  85. package/dist/services/prevention.service.d.ts +7 -0
  86. package/dist/services/prevention.service.js +38 -0
  87. package/dist/services/prevention.service.js.map +1 -1
  88. package/dist/services/research.service.d.ts +1 -0
  89. package/dist/services/research.service.js +4 -0
  90. package/dist/services/research.service.js.map +1 -1
  91. package/dist/services/solution.service.d.ts +10 -0
  92. package/dist/services/solution.service.js +48 -0
  93. package/dist/services/solution.service.js.map +1 -1
  94. package/dist/types/config.types.d.ts +21 -0
  95. package/dist/types/synapse.types.d.ts +1 -1
  96. package/package.json +8 -3
  97. package/src/api/server.ts +395 -0
  98. package/src/brain.ts +51 -8
  99. package/src/cli/commands/dashboard.ts +38 -1
  100. package/src/cli/commands/explain.ts +83 -0
  101. package/src/code/analyzer.ts +40 -0
  102. package/src/code/matcher.ts +67 -2
  103. package/src/code/scorer.ts +13 -1
  104. package/src/config.ts +24 -0
  105. package/src/dashboard/server.ts +142 -0
  106. package/src/db/migrations/007_feedback.ts +13 -0
  107. package/src/db/migrations/008_git_integration.ts +38 -0
  108. package/src/db/migrations/009_embeddings.ts +8 -0
  109. package/src/db/migrations/index.ts +6 -0
  110. package/src/db/repositories/code-module.repository.ts +53 -0
  111. package/src/db/repositories/error.repository.ts +40 -0
  112. package/src/db/repositories/insight.repository.ts +21 -0
  113. package/src/embeddings/engine.ts +238 -0
  114. package/src/hooks/post-tool-use.ts +2 -0
  115. package/src/hooks/post-write.ts +12 -0
  116. package/src/index.ts +3 -1
  117. package/src/ipc/router.ts +16 -0
  118. package/src/learning/confidence-scorer.ts +33 -0
  119. package/src/learning/learning-engine.ts +13 -5
  120. package/src/matching/error-matcher.ts +55 -4
  121. package/src/mcp/http-server.ts +140 -0
  122. package/src/mcp/tools.ts +52 -14
  123. package/src/services/analytics.service.ts +136 -0
  124. package/src/services/code.service.ts +120 -4
  125. package/src/services/error.service.ts +114 -13
  126. package/src/services/git.service.ts +132 -0
  127. package/src/services/prevention.service.ts +40 -0
  128. package/src/services/research.service.ts +5 -0
  129. package/src/services/solution.service.ts +58 -0
  130. package/src/types/config.types.ts +24 -0
  131. package/src/types/synapse.types.ts +1 -0
@@ -0,0 +1,37 @@
1
+ export function up(db) {
2
+ db.exec(`
3
+ CREATE TABLE IF NOT EXISTS git_commits (
4
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
5
+ project_id INTEGER NOT NULL,
6
+ commit_hash TEXT NOT NULL,
7
+ message TEXT NOT NULL,
8
+ author TEXT,
9
+ timestamp TEXT NOT NULL,
10
+ files_changed INTEGER NOT NULL DEFAULT 0,
11
+ insertions INTEGER NOT NULL DEFAULT 0,
12
+ deletions INTEGER NOT NULL DEFAULT 0,
13
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
14
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
15
+ UNIQUE(project_id, commit_hash)
16
+ );
17
+
18
+ CREATE TABLE IF NOT EXISTS error_commits (
19
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
20
+ error_id INTEGER NOT NULL,
21
+ commit_hash TEXT NOT NULL,
22
+ relationship TEXT NOT NULL DEFAULT 'introduced_by',
23
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
24
+ FOREIGN KEY (error_id) REFERENCES errors(id) ON DELETE CASCADE,
25
+ UNIQUE(error_id, commit_hash, relationship)
26
+ );
27
+
28
+ ALTER TABLE errors ADD COLUMN git_diff TEXT DEFAULT NULL;
29
+ ALTER TABLE errors ADD COLUMN git_branch TEXT DEFAULT NULL;
30
+
31
+ CREATE INDEX IF NOT EXISTS idx_git_commits_project ON git_commits(project_id);
32
+ CREATE INDEX IF NOT EXISTS idx_git_commits_hash ON git_commits(commit_hash);
33
+ CREATE INDEX IF NOT EXISTS idx_error_commits_error ON error_commits(error_id);
34
+ CREATE INDEX IF NOT EXISTS idx_error_commits_hash ON error_commits(commit_hash);
35
+ `);
36
+ }
37
+ //# sourceMappingURL=008_git_integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"008_git_integration.js","sourceRoot":"","sources":["../../../src/db/migrations/008_git_integration.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCP,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type Database from 'better-sqlite3';
2
+ export declare function up(db: Database.Database): void;
@@ -0,0 +1,7 @@
1
+ export function up(db) {
2
+ db.exec(`
3
+ ALTER TABLE errors ADD COLUMN embedding BLOB DEFAULT NULL;
4
+ ALTER TABLE code_modules ADD COLUMN embedding BLOB DEFAULT NULL;
5
+ `);
6
+ }
7
+ //# sourceMappingURL=009_embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"009_embeddings.js","sourceRoot":"","sources":["../../../src/db/migrations/009_embeddings.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;AACL,CAAC"}
@@ -5,6 +5,9 @@ import { up as codeSchema } from './003_code_schema.js';
5
5
  import { up as synapsesSchema } from './004_synapses_schema.js';
6
6
  import { up as ftsIndexes } from './005_fts_indexes.js';
7
7
  import { up as synapsesPhase3 } from './006_synapses_phase3.js';
8
+ import { up as feedbackSchema } from './007_feedback.js';
9
+ import { up as gitIntegration } from './008_git_integration.js';
10
+ import { up as embeddings } from './009_embeddings.js';
8
11
  const migrations = [
9
12
  { version: 1, name: '001_core_schema', up: coreSchema },
10
13
  { version: 2, name: '002_learning_schema', up: learningSchema },
@@ -12,6 +15,9 @@ const migrations = [
12
15
  { version: 4, name: '004_synapses_schema', up: synapsesSchema },
13
16
  { version: 5, name: '005_fts_indexes', up: ftsIndexes },
14
17
  { version: 6, name: '006_synapses_phase3', up: synapsesPhase3 },
18
+ { version: 7, name: '007_feedback', up: feedbackSchema },
19
+ { version: 8, name: '008_git_integration', up: gitIntegration },
20
+ { version: 9, name: '009_embeddings', up: embeddings },
15
21
  ];
16
22
  function ensureMigrationsTable(db) {
17
23
  db.exec(`
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQhE,MAAM,UAAU,GAAgB;IAC9B,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE;IACvD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;IAC/D,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE;IACvD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;IAC/D,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE;IACvD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;CAChE,CAAC;AAEF,SAAS,qBAAqB,CAAC,EAAqB;IAClD,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAqB;IAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,EAA4C,CAAC;IACzH,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAE1B,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;IAEnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,8BAA8B,cAAc,EAAE,CAAC,CAAC;IAErF,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACjC,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACpD,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjB,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC;IACT,MAAM,CAAC,IAAI,CAAC,uCAAuC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7F,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAQvD,MAAM,UAAU,GAAgB;IAC9B,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE;IACvD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;IAC/D,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE;IACvD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;IAC/D,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE;IACvD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;IAC/D,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE;IACxD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;IAC/D,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,UAAU,EAAE;CACvD,CAAC;AAEF,SAAS,qBAAqB,CAAC,EAAqB;IAClD,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAqB;IAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,EAA4C,CAAC;IACzH,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAE1B,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;IAEnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,8BAA8B,cAAc,EAAE,CAAC,CAAC;IAErF,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACjC,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACpD,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjB,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC;IACT,MAAM,CAAC,IAAI,CAAC,uCAAuC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7F,CAAC"}
@@ -16,5 +16,21 @@ export declare class CodeModuleRepository {
16
16
  search(query: string): CodeModuleRecord[];
17
17
  findAll(limit?: number): CodeModuleRecord[];
18
18
  countAll(): number;
19
+ upsertSimilarity(moduleAId: number, moduleBId: number, score: number): void;
20
+ findSimilarModules(moduleId: number, limit?: number): Array<{
21
+ module_id: number;
22
+ similarity_score: number;
23
+ name: string;
24
+ file_path: string;
25
+ }>;
26
+ findHighSimilarityPairs(minScore?: number, limit?: number): Array<{
27
+ module_a_id: number;
28
+ module_b_id: number;
29
+ similarity_score: number;
30
+ a_name: string;
31
+ a_path: string;
32
+ b_name: string;
33
+ b_path: string;
34
+ }>;
19
35
  }
20
36
  export {};
@@ -19,6 +19,33 @@ export class CodeModuleRepository {
19
19
  JOIN code_modules_fts fts ON cm.id = fts.rowid
20
20
  WHERE code_modules_fts MATCH ?
21
21
  ORDER BY rank
22
+ `),
23
+ upsertSimilarity: db.prepare(`
24
+ INSERT INTO module_similarities (module_a_id, module_b_id, similarity_score)
25
+ VALUES (@module_a_id, @module_b_id, @similarity_score)
26
+ ON CONFLICT(module_a_id, module_b_id)
27
+ DO UPDATE SET similarity_score = @similarity_score, computed_at = datetime('now')
28
+ `),
29
+ findSimilarModules: db.prepare(`
30
+ SELECT ms.*, cm.name, cm.file_path, cm.language, cm.reusability_score
31
+ FROM module_similarities ms
32
+ JOIN code_modules cm ON (
33
+ CASE WHEN ms.module_a_id = ? THEN ms.module_b_id ELSE ms.module_a_id END
34
+ ) = cm.id
35
+ WHERE ms.module_a_id = ? OR ms.module_b_id = ?
36
+ ORDER BY ms.similarity_score DESC
37
+ LIMIT ?
38
+ `),
39
+ findHighSimilarityPairs: db.prepare(`
40
+ SELECT ms.*,
41
+ a.name as a_name, a.file_path as a_path,
42
+ b.name as b_name, b.file_path as b_path
43
+ FROM module_similarities ms
44
+ JOIN code_modules a ON ms.module_a_id = a.id
45
+ JOIN code_modules b ON ms.module_b_id = b.id
46
+ WHERE ms.similarity_score >= ?
47
+ ORDER BY ms.similarity_score DESC
48
+ LIMIT ?
22
49
  `),
23
50
  };
24
51
  }
@@ -68,5 +95,20 @@ export class CodeModuleRepository {
68
95
  countAll() {
69
96
  return this.stmts.countAll.get().count;
70
97
  }
98
+ upsertSimilarity(moduleAId, moduleBId, score) {
99
+ // Always store with smaller id first for consistency
100
+ const [a, b] = moduleAId < moduleBId ? [moduleAId, moduleBId] : [moduleBId, moduleAId];
101
+ this.stmts.upsertSimilarity.run({
102
+ module_a_id: a,
103
+ module_b_id: b,
104
+ similarity_score: score,
105
+ });
106
+ }
107
+ findSimilarModules(moduleId, limit = 10) {
108
+ return this.stmts.findSimilarModules.all(moduleId, moduleId, moduleId, limit);
109
+ }
110
+ findHighSimilarityPairs(minScore = 0.75, limit = 50) {
111
+ return this.stmts.findHighSimilarityPairs.all(minScore, limit);
112
+ }
71
113
  }
72
114
  //# sourceMappingURL=code-module.repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-module.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/code-module.repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"code-module.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/code-module.repository.ts"],"names":[],"mappings":"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"}
@@ -16,5 +16,10 @@ export declare class ErrorRepository {
16
16
  countSince(since: string, projectId?: number): number;
17
17
  search(query: string): ErrorRecord[];
18
18
  incrementOccurrence(id: number): void;
19
+ createChain(parentErrorId: number, childErrorId: number, relationship?: string): void;
20
+ findChainChildren(errorId: number): ErrorRecord[];
21
+ findChainParents(errorId: number): ErrorRecord[];
22
+ findRecentByProject(projectId: number, since: string, limit?: number): ErrorRecord[];
23
+ findAll(limit?: number, offset?: number): ErrorRecord[];
19
24
  }
20
25
  export {};
@@ -8,6 +8,14 @@ export class ErrorRepository {
8
8
  INSERT INTO errors (project_id, terminal_id, fingerprint, type, message, raw_output, context, file_path, line_number, column_number)
9
9
  VALUES (@project_id, @terminal_id, @fingerprint, @type, @message, @raw_output, @context, @file_path, @line_number, @column_number)
10
10
  `),
11
+ createChain: this.db.prepare(`
12
+ INSERT OR IGNORE INTO error_chains (parent_error_id, child_error_id, relationship)
13
+ VALUES (@parent_error_id, @child_error_id, @relationship)
14
+ `),
15
+ findChainChildren: this.db.prepare('SELECT e.* FROM errors e JOIN error_chains ec ON e.id = ec.child_error_id WHERE ec.parent_error_id = ?'),
16
+ findChainParents: this.db.prepare('SELECT e.* FROM errors e JOIN error_chains ec ON e.id = ec.parent_error_id WHERE ec.child_error_id = ?'),
17
+ findRecentByProject: this.db.prepare('SELECT * FROM errors WHERE project_id = ? AND first_seen >= ? ORDER BY first_seen DESC LIMIT ?'),
18
+ findAllPaginated: this.db.prepare('SELECT * FROM errors ORDER BY last_seen DESC LIMIT ? OFFSET ?'),
11
19
  getById: this.db.prepare(`
12
20
  SELECT * FROM errors WHERE id = ?
13
21
  `),
@@ -130,5 +138,24 @@ export class ErrorRepository {
130
138
  incrementOccurrence(id) {
131
139
  this.stmts.incrementOccurrence.run(id);
132
140
  }
141
+ createChain(parentErrorId, childErrorId, relationship = 'caused_by_fix') {
142
+ this.stmts.createChain.run({
143
+ parent_error_id: parentErrorId,
144
+ child_error_id: childErrorId,
145
+ relationship,
146
+ });
147
+ }
148
+ findChainChildren(errorId) {
149
+ return this.stmts.findChainChildren.all(errorId);
150
+ }
151
+ findChainParents(errorId) {
152
+ return this.stmts.findChainParents.all(errorId);
153
+ }
154
+ findRecentByProject(projectId, since, limit = 10) {
155
+ return this.stmts.findRecentByProject.all(projectId, since, limit);
156
+ }
157
+ findAll(limit = 100, offset = 0) {
158
+ return this.stmts.findAllPaginated.all(limit, offset);
159
+ }
133
160
  }
134
161
  //# sourceMappingURL=error.repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/error.repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/error.repository.ts"],"names":[],"mappings":"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"}
@@ -14,5 +14,7 @@ export declare class InsightRepository {
14
14
  findByType(type: string): InsightRecord[];
15
15
  findByPriority(minPriority: number): InsightRecord[];
16
16
  expire(): number;
17
+ rate(id: number, rating: number, comment?: string): boolean;
18
+ findRated(minRating?: number): InsightRecord[];
17
19
  }
18
20
  export {};
@@ -53,5 +53,18 @@ export class InsightRepository {
53
53
  const result = this.stmts.expire.run();
54
54
  return result.changes;
55
55
  }
56
+ rate(id, rating, comment) {
57
+ const stmt = this.db.prepare(`UPDATE insights SET rating = ?, rating_comment = ?, rated_at = datetime('now') WHERE id = ?`);
58
+ const result = stmt.run(rating, comment ?? null, id);
59
+ return result.changes > 0;
60
+ }
61
+ findRated(minRating) {
62
+ if (minRating !== undefined) {
63
+ const stmt = this.db.prepare('SELECT * FROM insights WHERE rating IS NOT NULL AND rating >= ? ORDER BY rating DESC');
64
+ return stmt.all(minRating);
65
+ }
66
+ const stmt = this.db.prepare('SELECT * FROM insights WHERE rating IS NOT NULL ORDER BY rating DESC');
67
+ return stmt.all();
68
+ }
56
69
  }
57
70
  //# sourceMappingURL=insight.repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"insight.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/insight.repository.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,iBAAiB;IAGR;IAFZ,KAAK,CAA4B;IAEzC,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,KAAK,GAAG;YACX,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;;OAGlB,CAAC;YACF,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC;YAC1D,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC;YACvD,aAAa,EAAE,EAAE,CAAC,OAAO,CACvB,iFAAiF,CAClF;YACD,mBAAmB,EAAE,EAAE,CAAC,OAAO,CAC7B,oGAAoG,CACrG;YACD,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,8DAA8D,CAAC;YACtF,cAAc,EAAE,EAAE,CAAC,OAAO,CACxB,oFAAoF,CACrF;YACD,MAAM,EAAE,EAAE,CAAC,OAAO,CAChB,6GAA6G,CAC9G;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAmB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC,eAAyB,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAA8B,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,IAAmB;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAE,IAAgC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;QACvG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uBAAuB,UAAU,iBAAiB,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,SAAkB;QAC3B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAoB,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAqB,CAAC;IAC3D,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAoB,CAAC;IAC5D,CAAC;IAED,cAAc,CAAC,WAAmB;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAoB,CAAC;IACvE,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;CACF"}
1
+ {"version":3,"file":"insight.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/insight.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface EmbeddingConfig {
3
+ enabled: boolean;
4
+ modelName: string;
5
+ cacheDir: string;
6
+ sweepIntervalMs: number;
7
+ batchSize: number;
8
+ }
9
+ export declare class EmbeddingEngine {
10
+ private config;
11
+ private db;
12
+ private pipeline;
13
+ private ready;
14
+ private loading;
15
+ private logger;
16
+ private sweepTimer;
17
+ constructor(config: EmbeddingConfig, db: Database.Database);
18
+ initialize(): Promise<void>;
19
+ /** Start background embedding sweep */
20
+ start(): void;
21
+ stop(): void;
22
+ isReady(): boolean;
23
+ /** Generate embedding for a single text */
24
+ embed(text: string): Promise<Float32Array | null>;
25
+ /** Generate embeddings for a batch of texts */
26
+ embedBatch(texts: string[]): Promise<(Float32Array | null)[]>;
27
+ /** Compute and store embeddings for entries that don't have them yet */
28
+ sweep(): Promise<{
29
+ errors: number;
30
+ modules: number;
31
+ }>;
32
+ /** Load vector scores for error matching (sync - reads pre-computed embeddings from DB) */
33
+ computeErrorVectorScores(errorId: number, projectId: number): Map<number, number>;
34
+ /** Load vector scores for module-to-module matching (sync - reads pre-computed embeddings from DB) */
35
+ computeModuleVectorScores(moduleId: number, language?: string): Map<number, number>;
36
+ /** Serialize Float32Array to Buffer for SQLite BLOB storage */
37
+ static serialize(embedding: Float32Array): Buffer;
38
+ /** Deserialize SQLite BLOB to Float32Array */
39
+ static deserialize(buffer: Buffer): Float32Array;
40
+ /** Cosine similarity (embeddings are L2-normalized, so dot product = cosine) */
41
+ static similarity(a: Float32Array, b: Float32Array): number;
42
+ }
@@ -0,0 +1,179 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ export class EmbeddingEngine {
3
+ config;
4
+ db;
5
+ pipeline = null;
6
+ ready = false;
7
+ loading = false;
8
+ logger = getLogger();
9
+ sweepTimer = null;
10
+ constructor(config, db) {
11
+ this.config = config;
12
+ this.db = db;
13
+ }
14
+ async initialize() {
15
+ if (!this.config.enabled || this.loading || this.ready)
16
+ return;
17
+ this.loading = true;
18
+ try {
19
+ const { pipeline, env } = await import('@huggingface/transformers');
20
+ env.cacheDir = this.config.cacheDir;
21
+ this.pipeline = await pipeline('feature-extraction', this.config.modelName, { dtype: 'q8' });
22
+ this.ready = true;
23
+ this.logger.info(`Embedding model loaded: ${this.config.modelName}`);
24
+ }
25
+ catch (err) {
26
+ this.logger.warn(`Failed to load embedding model (will retry): ${err}`);
27
+ this.ready = false;
28
+ }
29
+ finally {
30
+ this.loading = false;
31
+ }
32
+ }
33
+ /** Start background embedding sweep */
34
+ start() {
35
+ if (!this.config.enabled)
36
+ return;
37
+ // Initialize model in background
38
+ this.initialize().then(() => {
39
+ if (this.ready) {
40
+ // Run initial sweep
41
+ this.sweep().catch(err => this.logger.error('Embedding sweep error:', err));
42
+ }
43
+ });
44
+ // Periodic sweep for new entries
45
+ this.sweepTimer = setInterval(() => {
46
+ if (this.ready) {
47
+ this.sweep().catch(err => this.logger.error('Embedding sweep error:', err));
48
+ }
49
+ }, this.config.sweepIntervalMs);
50
+ }
51
+ stop() {
52
+ if (this.sweepTimer) {
53
+ clearInterval(this.sweepTimer);
54
+ this.sweepTimer = null;
55
+ }
56
+ }
57
+ isReady() {
58
+ return this.ready;
59
+ }
60
+ /** Generate embedding for a single text */
61
+ async embed(text) {
62
+ if (!this.ready || !this.pipeline)
63
+ return null;
64
+ try {
65
+ const output = await this.pipeline(text, { pooling: 'mean', normalize: true });
66
+ const data = output.tolist()[0];
67
+ return new Float32Array(data);
68
+ }
69
+ catch (err) {
70
+ this.logger.error(`Embedding error: ${err}`);
71
+ return null;
72
+ }
73
+ }
74
+ /** Generate embeddings for a batch of texts */
75
+ async embedBatch(texts) {
76
+ if (!this.ready || !this.pipeline || texts.length === 0)
77
+ return texts.map(() => null);
78
+ try {
79
+ const output = await this.pipeline(texts, { pooling: 'mean', normalize: true });
80
+ const list = output.tolist();
81
+ return list.map(v => new Float32Array(v));
82
+ }
83
+ catch (err) {
84
+ this.logger.error(`Batch embedding error: ${err}`);
85
+ return texts.map(() => null);
86
+ }
87
+ }
88
+ /** Compute and store embeddings for entries that don't have them yet */
89
+ async sweep() {
90
+ let errorsProcessed = 0;
91
+ let modulesProcessed = 0;
92
+ // Process errors without embeddings
93
+ const pendingErrors = this.db.prepare('SELECT id, type, message, context FROM errors WHERE embedding IS NULL ORDER BY id DESC LIMIT ?').all(this.config.batchSize);
94
+ if (pendingErrors.length > 0) {
95
+ const texts = pendingErrors.map(e => [e.type, e.message, e.context].filter(Boolean).join(' '));
96
+ const embeddings = await this.embedBatch(texts);
97
+ const updateStmt = this.db.prepare('UPDATE errors SET embedding = ? WHERE id = ?');
98
+ for (let i = 0; i < pendingErrors.length; i++) {
99
+ const emb = embeddings[i];
100
+ if (emb) {
101
+ updateStmt.run(EmbeddingEngine.serialize(emb), pendingErrors[i].id);
102
+ errorsProcessed++;
103
+ }
104
+ }
105
+ }
106
+ // Process code modules without embeddings
107
+ const pendingModules = this.db.prepare('SELECT id, name, description, file_path FROM code_modules WHERE embedding IS NULL ORDER BY id DESC LIMIT ?').all(this.config.batchSize);
108
+ if (pendingModules.length > 0) {
109
+ const texts = pendingModules.map(m => [m.name, m.description, m.file_path].filter(Boolean).join(' '));
110
+ const embeddings = await this.embedBatch(texts);
111
+ const updateStmt = this.db.prepare('UPDATE code_modules SET embedding = ? WHERE id = ?');
112
+ for (let i = 0; i < pendingModules.length; i++) {
113
+ const emb = embeddings[i];
114
+ if (emb) {
115
+ updateStmt.run(EmbeddingEngine.serialize(emb), pendingModules[i].id);
116
+ modulesProcessed++;
117
+ }
118
+ }
119
+ }
120
+ if (errorsProcessed > 0 || modulesProcessed > 0) {
121
+ this.logger.info(`Embedding sweep: ${errorsProcessed} errors, ${modulesProcessed} modules processed`);
122
+ }
123
+ return { errors: errorsProcessed, modules: modulesProcessed };
124
+ }
125
+ /** Load vector scores for error matching (sync - reads pre-computed embeddings from DB) */
126
+ computeErrorVectorScores(errorId, projectId) {
127
+ const scores = new Map();
128
+ const errorRow = this.db.prepare('SELECT embedding FROM errors WHERE id = ?').get(errorId);
129
+ if (!errorRow?.embedding)
130
+ return scores;
131
+ const incoming = EmbeddingEngine.deserialize(errorRow.embedding);
132
+ const candidates = this.db.prepare('SELECT id, embedding FROM errors WHERE project_id = ? AND id != ? AND embedding IS NOT NULL').all(projectId, errorId);
133
+ for (const c of candidates) {
134
+ const candidate = EmbeddingEngine.deserialize(c.embedding);
135
+ scores.set(c.id, EmbeddingEngine.similarity(incoming, candidate));
136
+ }
137
+ return scores;
138
+ }
139
+ /** Load vector scores for module-to-module matching (sync - reads pre-computed embeddings from DB) */
140
+ computeModuleVectorScores(moduleId, language) {
141
+ const scores = new Map();
142
+ const moduleRow = this.db.prepare('SELECT embedding FROM code_modules WHERE id = ?').get(moduleId);
143
+ if (!moduleRow?.embedding)
144
+ return scores;
145
+ const incoming = EmbeddingEngine.deserialize(moduleRow.embedding);
146
+ let sql = 'SELECT id, embedding FROM code_modules WHERE id != ? AND embedding IS NOT NULL';
147
+ const params = [moduleId];
148
+ if (language) {
149
+ sql += ' AND language = ?';
150
+ params.push(language);
151
+ }
152
+ const candidates = this.db.prepare(sql).all(...params);
153
+ for (const c of candidates) {
154
+ const candidate = EmbeddingEngine.deserialize(c.embedding);
155
+ scores.set(c.id, EmbeddingEngine.similarity(incoming, candidate));
156
+ }
157
+ return scores;
158
+ }
159
+ /** Serialize Float32Array to Buffer for SQLite BLOB storage */
160
+ static serialize(embedding) {
161
+ return Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);
162
+ }
163
+ /** Deserialize SQLite BLOB to Float32Array */
164
+ static deserialize(buffer) {
165
+ const copy = Buffer.from(buffer);
166
+ return new Float32Array(copy.buffer, copy.byteOffset, copy.length / 4);
167
+ }
168
+ /** Cosine similarity (embeddings are L2-normalized, so dot product = cosine) */
169
+ static similarity(a, b) {
170
+ if (a.length !== b.length)
171
+ return 0;
172
+ let dot = 0;
173
+ for (let i = 0; i < a.length; i++) {
174
+ dot += a[i] * b[i];
175
+ }
176
+ return Math.max(0, Math.min(1, dot));
177
+ }
178
+ }
179
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/embeddings/engine.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,8 @@ async function main() {
52
52
  const result = await client.request('error.report', {
53
53
  project: 'auto-detected',
54
54
  errorOutput: input.tool_output,
55
+ command: input.tool_input?.command,
56
+ workingDirectory: process.cwd(),
55
57
  });
56
58
  if (result.matches?.length > 0) {
57
59
  const best = result.matches[0];
@@ -1 +1 @@
1
- {"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hooks/post-tool-use.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hooks/post-tool-use.ts"],"names":[],"mappings":"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"}
@@ -78,6 +78,17 @@ async function main() {
78
78
  process.stderr.write(`Brain: Very similar code exists (module #${best.moduleId}, ${Math.round(best.score * 100)}% match). Consider reusing.\n`);
79
79
  }
80
80
  }
81
+ // Proactive Prevention: check if written code matches error-causing patterns
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ const prevention = await client.request('prevention.checkCode', {
84
+ source: input.tool_input.content ?? '',
85
+ filePath,
86
+ });
87
+ if (prevention?.warnings?.length > 0) {
88
+ for (const warning of prevention.warnings.slice(0, 3)) {
89
+ process.stderr.write(`Brain WARNING: ${warning.message}\n`);
90
+ }
91
+ }
81
92
  // Auto-register the written file into Brain
82
93
  const fileName = filePath.replace(/\\/g, '/').split('/').pop() ?? 'unknown';
83
94
  const projectName = detectProject(filePath);
@@ -1 +1 @@
1
- {"version":3,"file":"post-write.js","sourceRoot":"","sources":["../../src/hooks/post-write.ts"],"names":[],"mappings":";AAEA,4EAA4E;AAC5E,uCAAuC;AACvC,gIAAgI;AAEhI,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQhD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACjD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAClD,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG;IACnB,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;IAC7C,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU;CACvC,CAAC;AAEF,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChD,2EAA2E;IAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,qFAAqF;IACrF,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9F,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,+EAA+E;IAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC3D,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC3D,MAAM,GAAG,GAA2B;QAClC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY;QACxE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM;QAChD,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK;QACtC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO;KACxB,CAAC;IACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACzB,CAAC;AAED,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,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO;IAExB,IAAI,KAAgB,CAAC;IACrB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC;IAC7C,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QAAE,OAAO;IAEjD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QAEvB,kCAAkC;QAClC,8DAA8D;QAC9D,MAAM,YAAY,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE;YAChE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE;YACtC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,YAAY,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;gBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAClJ,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;QAC5E,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC5C,8DAA8D;QAC9D,MAAM,MAAM,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE;YACvD,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,QAAQ;YACd,QAAQ;YACR,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;YAClC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE;SACvC,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,QAAQ,YAAY,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;IACtJ,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"post-write.js","sourceRoot":"","sources":["../../src/hooks/post-write.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -14,11 +14,12 @@ import { learnCommand } from './cli/commands/learn.js';
14
14
  import { configCommand } from './cli/commands/config.js';
15
15
  import { projectsCommand } from './cli/commands/projects.js';
16
16
  import { doctorCommand } from './cli/commands/doctor.js';
17
+ import { explainCommand } from './cli/commands/explain.js';
17
18
  const program = new Command();
18
19
  program
19
20
  .name('brain')
20
21
  .description('Brain — Adaptive Error Memory & Code Intelligence System')
21
- .version('1.2.0');
22
+ .version('1.8.1');
22
23
  program.addCommand(startCommand());
23
24
  program.addCommand(stopCommand());
24
25
  program.addCommand(statusCommand());
@@ -33,6 +34,7 @@ program.addCommand(learnCommand());
33
34
  program.addCommand(configCommand());
34
35
  program.addCommand(projectsCommand());
35
36
  program.addCommand(doctorCommand());
37
+ program.addCommand(explainCommand());
36
38
  // Hidden command: run MCP server (called by Claude Code)
37
39
  program
38
40
  .command('mcp-server')