@pcircle/memesh 4.1.0 → 4.1.2

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 (92) hide show
  1. package/README.md +3 -3
  2. package/dashboard/dist/index.html +3 -3
  3. package/dist/core/analytics.d.ts +53 -0
  4. package/dist/core/analytics.d.ts.map +1 -0
  5. package/dist/core/analytics.js +127 -0
  6. package/dist/core/analytics.js.map +1 -0
  7. package/dist/core/auto-tagger.d.ts.map +1 -1
  8. package/dist/core/auto-tagger.js +14 -54
  9. package/dist/core/auto-tagger.js.map +1 -1
  10. package/dist/core/config.d.ts +1 -0
  11. package/dist/core/config.d.ts.map +1 -1
  12. package/dist/core/config.js.map +1 -1
  13. package/dist/core/consolidator.d.ts.map +1 -1
  14. package/dist/core/consolidator.js +11 -61
  15. package/dist/core/consolidator.js.map +1 -1
  16. package/dist/core/doctor.d.ts.map +1 -1
  17. package/dist/core/doctor.js +47 -0
  18. package/dist/core/doctor.js.map +1 -1
  19. package/dist/core/failure-analyzer.d.ts +2 -1
  20. package/dist/core/failure-analyzer.d.ts.map +1 -1
  21. package/dist/core/failure-analyzer.js +14 -47
  22. package/dist/core/failure-analyzer.js.map +1 -1
  23. package/dist/core/graph.d.ts +13 -0
  24. package/dist/core/graph.d.ts.map +1 -0
  25. package/dist/core/graph.js +13 -0
  26. package/dist/core/graph.js.map +1 -0
  27. package/dist/core/lesson-engine.d.ts +2 -1
  28. package/dist/core/lesson-engine.d.ts.map +1 -1
  29. package/dist/core/lesson-engine.js +2 -0
  30. package/dist/core/lesson-engine.js.map +1 -1
  31. package/dist/core/lifecycle.d.ts.map +1 -1
  32. package/dist/core/lifecycle.js +2 -1
  33. package/dist/core/lifecycle.js.map +1 -1
  34. package/dist/core/llm-client.d.ts +6 -0
  35. package/dist/core/llm-client.d.ts.map +1 -0
  36. package/dist/core/llm-client.js +64 -0
  37. package/dist/core/llm-client.js.map +1 -0
  38. package/dist/core/operations.d.ts +0 -1
  39. package/dist/core/operations.d.ts.map +1 -1
  40. package/dist/core/operations.js +40 -61
  41. package/dist/core/operations.js.map +1 -1
  42. package/dist/core/prompt-safety.d.ts +3 -0
  43. package/dist/core/prompt-safety.d.ts.map +1 -0
  44. package/dist/core/prompt-safety.js +13 -0
  45. package/dist/core/prompt-safety.js.map +1 -0
  46. package/dist/core/query-expander.d.ts.map +1 -1
  47. package/dist/core/query-expander.js +11 -72
  48. package/dist/core/query-expander.js.map +1 -1
  49. package/dist/core/schema-export.d.ts.map +1 -1
  50. package/dist/core/schema-export.js +38 -0
  51. package/dist/core/schema-export.js.map +1 -1
  52. package/dist/core/skill-usage-log.d.ts.map +1 -1
  53. package/dist/core/skill-usage-log.js +5 -1
  54. package/dist/core/skill-usage-log.js.map +1 -1
  55. package/dist/core/stats.d.ts +12 -0
  56. package/dist/core/stats.d.ts.map +1 -0
  57. package/dist/core/stats.js +19 -0
  58. package/dist/core/stats.js.map +1 -0
  59. package/dist/core/types.d.ts +9 -2
  60. package/dist/core/types.d.ts.map +1 -1
  61. package/dist/core/verifier.d.ts.map +1 -1
  62. package/dist/core/verifier.js +59 -6
  63. package/dist/core/verifier.js.map +1 -1
  64. package/dist/db.d.ts.map +1 -1
  65. package/dist/db.js +14 -0
  66. package/dist/db.js.map +1 -1
  67. package/dist/knowledge-graph.d.ts.map +1 -1
  68. package/dist/knowledge-graph.js +8 -43
  69. package/dist/knowledge-graph.js.map +1 -1
  70. package/dist/skills-manifest.json +71 -0
  71. package/dist/storage/conflicts.d.ts +4 -0
  72. package/dist/storage/conflicts.d.ts.map +1 -0
  73. package/dist/storage/conflicts.js +32 -0
  74. package/dist/storage/conflicts.js.map +1 -0
  75. package/dist/storage/fts-index.d.ts +4 -0
  76. package/dist/storage/fts-index.d.ts.map +1 -0
  77. package/dist/storage/fts-index.js +18 -0
  78. package/dist/storage/fts-index.js.map +1 -0
  79. package/dist/transports/cli/cli.js +97 -73
  80. package/dist/transports/cli/cli.js.map +1 -1
  81. package/dist/transports/http/server.d.ts +1 -0
  82. package/dist/transports/http/server.d.ts.map +1 -1
  83. package/dist/transports/http/server.js +142 -244
  84. package/dist/transports/http/server.js.map +1 -1
  85. package/package.json +2 -2
  86. package/plugin.json +1 -1
  87. package/scripts/hooks/_shared.js +207 -1
  88. package/scripts/hooks/post-commit.js +5 -76
  89. package/scripts/hooks/pre-bash-orchestration-nudge.js +2 -2
  90. package/scripts/hooks/pre-compact.js +8 -76
  91. package/scripts/hooks/session-start.js +16 -8
  92. package/scripts/hooks/session-summary.js +12 -81
@@ -5,64 +5,12 @@
5
5
  // and stores as session-insight entities in MeMesh.
6
6
 
7
7
  import { createRequire } from 'module';
8
- import { homedir } from 'os';
9
- import { join, basename, dirname } from 'path';
10
- import { existsSync, mkdirSync, readFileSync } from 'fs';
11
- import { fileURLToPath } from 'url';
12
- import { getMemeshDir } from './_shared.js';
8
+ import { join, basename } from 'path';
9
+ import { existsSync, readFileSync } from 'fs';
10
+ import { getMemeshDir, isAutoCaptureEnabled, openHookDb, resolvePluginRoot } from './_shared.js';
13
11
 
14
12
  const require = createRequire(import.meta.url);
15
13
 
16
- const SCHEMA_SQL = `
17
- CREATE TABLE IF NOT EXISTS entities (
18
- id INTEGER PRIMARY KEY AUTOINCREMENT,
19
- name TEXT NOT NULL UNIQUE,
20
- type TEXT NOT NULL,
21
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
22
- metadata JSON
23
- );
24
-
25
- CREATE TABLE IF NOT EXISTS observations (
26
- id INTEGER PRIMARY KEY AUTOINCREMENT,
27
- entity_id INTEGER NOT NULL,
28
- content TEXT NOT NULL,
29
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
30
- FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
31
- );
32
-
33
- CREATE TABLE IF NOT EXISTS relations (
34
- id INTEGER PRIMARY KEY AUTOINCREMENT,
35
- from_entity_id INTEGER NOT NULL,
36
- to_entity_id INTEGER NOT NULL,
37
- relation_type TEXT NOT NULL,
38
- metadata JSON,
39
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
40
- FOREIGN KEY (from_entity_id) REFERENCES entities(id) ON DELETE CASCADE,
41
- FOREIGN KEY (to_entity_id) REFERENCES entities(id) ON DELETE CASCADE,
42
- UNIQUE(from_entity_id, to_entity_id, relation_type)
43
- );
44
-
45
- CREATE TABLE IF NOT EXISTS tags (
46
- id INTEGER PRIMARY KEY AUTOINCREMENT,
47
- entity_id INTEGER NOT NULL,
48
- tag TEXT NOT NULL,
49
- FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
50
- );
51
-
52
- CREATE INDEX IF NOT EXISTS idx_tags_entity ON tags(entity_id);
53
- CREATE INDEX IF NOT EXISTS idx_tags_tag ON tags(tag);
54
- DELETE FROM tags
55
- WHERE id NOT IN (
56
- SELECT MIN(id)
57
- FROM tags
58
- GROUP BY entity_id, tag
59
- );
60
- CREATE UNIQUE INDEX IF NOT EXISTS idx_tags_entity_tag_unique ON tags(entity_id, tag);
61
- CREATE INDEX IF NOT EXISTS idx_observations_entity ON observations(entity_id);
62
- CREATE INDEX IF NOT EXISTS idx_relations_from ON relations(from_entity_id);
63
- CREATE INDEX IF NOT EXISTS idx_relations_to ON relations(to_entity_id);
64
- `;
65
-
66
14
  // Parse a JSONL transcript file.
67
15
  // Mirrors logic in src/core/extractor.ts parseTranscript().
68
16
  // Defensive: never throws — malformed lines are silently skipped.
@@ -124,8 +72,8 @@ process.stdin.on('end', async () => {
124
72
  try {
125
73
  if (!input.trim()) return exit0();
126
74
 
127
- // Opt-out check
128
- if (process.env.MEMESH_AUTO_CAPTURE === 'false') return exit0();
75
+ // Opt-out check (env > config > default-on)
76
+ if (!isAutoCaptureEnabled(process.env)) return exit0();
129
77
 
130
78
  let inputData;
131
79
  try {
@@ -151,30 +99,12 @@ process.stdin.on('end', async () => {
151
99
  // Skip sessions with too little activity
152
100
  if (toolCallCount < 3) return exit0();
153
101
 
154
- // Open DB
155
- const dbPath = process.env.MEMESH_DB_PATH || join(homedir(), '.memesh', 'knowledge-graph.db');
156
- const dbDir = getMemeshDir(process.env);
157
- if (!existsSync(dbDir)) mkdirSync(dbDir, { recursive: true });
158
-
159
- const Database = require('better-sqlite3');
102
+ // Open DB via shared helper — applies SCHEMA_SQL + status migration.
103
+ // sqlite-vec is loaded separately because only this hook needs it
104
+ // (for embedding-aware recall-effectiveness tracking).
160
105
  const sqliteVec = require('sqlite-vec');
161
-
162
- const db = new Database(dbPath);
106
+ const { db } = openHookDb(process.env);
163
107
  try {
164
- db.pragma('journal_mode = WAL');
165
- db.pragma('foreign_keys = ON');
166
-
167
- // Ensure schema exists (tables may already exist from MeMesh server)
168
- db.exec(SCHEMA_SQL);
169
-
170
- // Migrate: add status column if missing (v2.11 -> v2.12)
171
- const cols = db.prepare("PRAGMA table_info(entities)").all();
172
- if (!cols.some(c => c.name === 'status')) {
173
- db.exec("ALTER TABLE entities ADD COLUMN status TEXT NOT NULL DEFAULT 'active'");
174
- db.exec("CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status)");
175
- }
176
-
177
- // Load sqlite-vec extension
178
108
  sqliteVec.load(db);
179
109
 
180
110
  // Duplicate detection: if we already captured this session, bail
@@ -326,8 +256,9 @@ process.stdin.on('end', async () => {
326
256
  // Wrapped in its own try/catch — never blocks rule-based extraction.
327
257
  if (errorsEncountered.length > 0 && filesEdited.length > 0) {
328
258
  try {
329
- const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT
330
- || dirname(dirname(fileURLToPath(import.meta.url)));
259
+ // F5: derive pluginRoot strictly from this file's location.
260
+ // See `resolvePluginRoot` for the full reasoning.
261
+ const pluginRoot = resolvePluginRoot(import.meta.url);
331
262
  const configMod = await import(join(pluginRoot, 'dist/core/config.js'));
332
263
  const config = configMod.readConfig();
333
264