mindlore 0.7.4 → 0.7.5

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 (148) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +18 -0
  4. package/dist/scripts/bundle-hooks.js +3 -4
  5. package/dist/scripts/bundle-hooks.js.map +1 -1
  6. package/dist/scripts/init.js +69 -3
  7. package/dist/scripts/init.js.map +1 -1
  8. package/dist/scripts/lib/constants.d.ts +20 -0
  9. package/dist/scripts/lib/constants.d.ts.map +1 -1
  10. package/dist/scripts/lib/constants.js +32 -1
  11. package/dist/scripts/lib/constants.js.map +1 -1
  12. package/dist/scripts/lib/db-helpers.d.ts +1 -0
  13. package/dist/scripts/lib/db-helpers.d.ts.map +1 -1
  14. package/dist/scripts/lib/db-helpers.js +37 -0
  15. package/dist/scripts/lib/db-helpers.js.map +1 -1
  16. package/dist/scripts/lib/detect-plugin.js +1 -1
  17. package/dist/scripts/lib/detect-plugin.js.map +1 -1
  18. package/dist/scripts/lib/episodes.d.ts +1 -1
  19. package/dist/scripts/lib/episodes.d.ts.map +1 -1
  20. package/dist/scripts/lib/episodes.js +1 -1
  21. package/dist/scripts/lib/episodes.js.map +1 -1
  22. package/dist/scripts/lib/session-payload.d.ts.map +1 -1
  23. package/dist/scripts/lib/session-payload.js +3 -5
  24. package/dist/scripts/lib/session-payload.js.map +1 -1
  25. package/dist/scripts/lib/skill-runner.d.ts +3 -0
  26. package/dist/scripts/lib/skill-runner.d.ts.map +1 -0
  27. package/dist/scripts/lib/skill-runner.js +78 -0
  28. package/dist/scripts/lib/skill-runner.js.map +1 -0
  29. package/dist/scripts/lib/telemetry-scan.d.ts +19 -0
  30. package/dist/scripts/lib/telemetry-scan.d.ts.map +1 -0
  31. package/dist/scripts/lib/telemetry-scan.js +42 -0
  32. package/dist/scripts/lib/telemetry-scan.js.map +1 -0
  33. package/dist/scripts/mindlore-clean-cache.d.ts +3 -0
  34. package/dist/scripts/mindlore-clean-cache.d.ts.map +1 -0
  35. package/dist/scripts/mindlore-clean-cache.js +65 -0
  36. package/dist/scripts/mindlore-clean-cache.js.map +1 -0
  37. package/dist/scripts/mindlore-doctor.d.ts.map +1 -1
  38. package/dist/scripts/mindlore-doctor.js +10 -13
  39. package/dist/scripts/mindlore-doctor.js.map +1 -1
  40. package/dist/scripts/reflect-failure-scan.d.ts +3 -0
  41. package/dist/scripts/reflect-failure-scan.d.ts.map +1 -0
  42. package/dist/scripts/reflect-failure-scan.js +41 -0
  43. package/dist/scripts/reflect-failure-scan.js.map +1 -0
  44. package/dist/tests/clean-cache.test.d.ts +2 -0
  45. package/dist/tests/clean-cache.test.d.ts.map +1 -0
  46. package/dist/tests/clean-cache.test.js +59 -0
  47. package/dist/tests/clean-cache.test.js.map +1 -0
  48. package/dist/tests/db-helpers-vec.test.d.ts +2 -0
  49. package/dist/tests/db-helpers-vec.test.d.ts.map +1 -0
  50. package/dist/tests/db-helpers-vec.test.js +32 -0
  51. package/dist/tests/db-helpers-vec.test.js.map +1 -0
  52. package/dist/tests/db-helpers.test.d.ts +2 -0
  53. package/dist/tests/db-helpers.test.d.ts.map +1 -0
  54. package/dist/tests/db-helpers.test.js +30 -0
  55. package/dist/tests/db-helpers.test.js.map +1 -0
  56. package/dist/tests/diary.test.js +3 -3
  57. package/dist/tests/diary.test.js.map +1 -1
  58. package/dist/tests/episodes-inject.test.js +5 -5
  59. package/dist/tests/episodes-inject.test.js.map +1 -1
  60. package/dist/tests/init-spawn-cleanup.test.d.ts +2 -0
  61. package/dist/tests/init-spawn-cleanup.test.d.ts.map +1 -0
  62. package/dist/tests/init-spawn-cleanup.test.js +21 -0
  63. package/dist/tests/init-spawn-cleanup.test.js.map +1 -0
  64. package/dist/tests/install-matrix.test.js +39 -0
  65. package/dist/tests/install-matrix.test.js.map +1 -1
  66. package/dist/tests/learnings-loader.test.d.ts +2 -0
  67. package/dist/tests/learnings-loader.test.d.ts.map +1 -0
  68. package/dist/tests/learnings-loader.test.js +64 -0
  69. package/dist/tests/learnings-loader.test.js.map +1 -0
  70. package/dist/tests/mindlore-home-env.test.d.ts +2 -0
  71. package/dist/tests/mindlore-home-env.test.d.ts.map +1 -0
  72. package/dist/tests/mindlore-home-env.test.js +33 -0
  73. package/dist/tests/mindlore-home-env.test.js.map +1 -0
  74. package/dist/tests/no-hardcoded-cache.test.d.ts +2 -0
  75. package/dist/tests/no-hardcoded-cache.test.d.ts.map +1 -0
  76. package/dist/tests/no-hardcoded-cache.test.js +40 -0
  77. package/dist/tests/no-hardcoded-cache.test.js.map +1 -0
  78. package/dist/tests/nomination.test.js +1 -1
  79. package/dist/tests/nomination.test.js.map +1 -1
  80. package/dist/tests/reflect-failure-scan.test.d.ts +2 -0
  81. package/dist/tests/reflect-failure-scan.test.d.ts.map +1 -0
  82. package/dist/tests/reflect-failure-scan.test.js +49 -0
  83. package/dist/tests/reflect-failure-scan.test.js.map +1 -0
  84. package/dist/tests/reflect-trigger.test.d.ts +2 -0
  85. package/dist/tests/reflect-trigger.test.d.ts.map +1 -0
  86. package/dist/tests/reflect-trigger.test.js +31 -0
  87. package/dist/tests/reflect-trigger.test.js.map +1 -0
  88. package/dist/tests/session-focus-episode-counter.test.d.ts +2 -0
  89. package/dist/tests/session-focus-episode-counter.test.d.ts.map +1 -0
  90. package/dist/tests/session-focus-episode-counter.test.js +41 -0
  91. package/dist/tests/session-focus-episode-counter.test.js.map +1 -0
  92. package/dist/tests/session-focus-learnings-inject.test.d.ts +2 -0
  93. package/dist/tests/session-focus-learnings-inject.test.d.ts.map +1 -0
  94. package/dist/tests/session-focus-learnings-inject.test.js +29 -0
  95. package/dist/tests/session-focus-learnings-inject.test.js.map +1 -0
  96. package/dist/tests/session-focus-nomination-inject.test.d.ts +2 -0
  97. package/dist/tests/session-focus-nomination-inject.test.d.ts.map +1 -0
  98. package/dist/tests/session-focus-nomination-inject.test.js +50 -0
  99. package/dist/tests/session-focus-nomination-inject.test.js.map +1 -0
  100. package/dist/tests/session-focus-reflect-nudge.test.d.ts +2 -0
  101. package/dist/tests/session-focus-reflect-nudge.test.d.ts.map +1 -0
  102. package/dist/tests/session-focus-reflect-nudge.test.js +62 -0
  103. package/dist/tests/session-focus-reflect-nudge.test.js.map +1 -0
  104. package/dist/tests/session-payload.test.js +6 -12
  105. package/dist/tests/session-payload.test.js.map +1 -1
  106. package/dist/tests/skill-md-uses-runner.test.d.ts +2 -0
  107. package/dist/tests/skill-md-uses-runner.test.d.ts.map +1 -0
  108. package/dist/tests/skill-md-uses-runner.test.js +31 -0
  109. package/dist/tests/skill-md-uses-runner.test.js.map +1 -0
  110. package/dist/tests/skill-runner-failure-e2e.test.d.ts +10 -0
  111. package/dist/tests/skill-runner-failure-e2e.test.d.ts.map +1 -0
  112. package/dist/tests/skill-runner-failure-e2e.test.js +64 -0
  113. package/dist/tests/skill-runner-failure-e2e.test.js.map +1 -0
  114. package/dist/tests/skill-runner.test.d.ts +2 -0
  115. package/dist/tests/skill-runner.test.d.ts.map +1 -0
  116. package/dist/tests/skill-runner.test.js +55 -0
  117. package/dist/tests/skill-runner.test.js.map +1 -0
  118. package/dist/tests/sync-scripts.test.d.ts +2 -0
  119. package/dist/tests/sync-scripts.test.d.ts.map +1 -0
  120. package/dist/tests/sync-scripts.test.js +26 -0
  121. package/dist/tests/sync-scripts.test.js.map +1 -0
  122. package/dist/tests/telemetry-scan.test.d.ts +2 -0
  123. package/dist/tests/telemetry-scan.test.d.ts.map +1 -0
  124. package/dist/tests/telemetry-scan.test.js +32 -0
  125. package/dist/tests/telemetry-scan.test.js.map +1 -0
  126. package/hooks/cc-memory-bulk-sync.cjs +19 -1
  127. package/hooks/cc-session-sync.cjs +19 -1
  128. package/hooks/lib/constants.cjs +1 -1
  129. package/hooks/lib/learnings-loader.cjs +70 -0
  130. package/hooks/lib/mindlore-common.cjs +5 -0
  131. package/hooks/lib/reflect-trigger.cjs +29 -0
  132. package/hooks/lib/sync-scripts.cjs +12 -0
  133. package/hooks/mindlore-search.cjs +97 -1
  134. package/hooks/mindlore-session-focus.cjs +76 -10
  135. package/hooks/src/lib/mindlore-common.cjs +5 -0
  136. package/hooks/src/mindlore-session-focus.cjs +47 -5
  137. package/package.json +4 -2
  138. package/plugin.json +1 -1
  139. package/skills/mindlore-decide/SKILL.md +1 -1
  140. package/skills/mindlore-diary/SKILL.md +4 -4
  141. package/skills/mindlore-evolve/SKILL.md +2 -2
  142. package/skills/mindlore-health/SKILL.md +2 -2
  143. package/skills/mindlore-ingest/SKILL.md +7 -7
  144. package/skills/mindlore-log/SKILL.md +1 -1
  145. package/skills/mindlore-maintain/SKILL.md +2 -2
  146. package/skills/mindlore-query/SKILL.md +1 -1
  147. package/skills/mindlore-reflect/SKILL.md +30 -16
  148. package/templates/config.json +1 -1
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const telemetry_scan_1 = require("../scripts/lib/telemetry-scan");
10
+ const tmpTelemetry = path_1.default.join(os_1.default.tmpdir(), `scan-test-${Date.now()}.jsonl`);
11
+ afterEach(() => { if (fs_1.default.existsSync(tmpTelemetry))
12
+ fs_1.default.unlinkSync(tmpTelemetry); });
13
+ function writeLines(...lines) {
14
+ fs_1.default.writeFileSync(tmpTelemetry, lines.map(l => JSON.stringify(l)).join('\n') + '\n');
15
+ }
16
+ test('scanFailures returns only entries with ok:false AND failure regex match', () => {
17
+ writeLines({ ts: '2026-05-15T10:00:00Z', skill: 's', script: 'a', ok: true, exit_code: 0, output: 'all good' }, { ts: '2026-05-15T10:01:00Z', skill: 's', script: 'b', ok: false, exit_code: 1, output: 'Error: missing file' }, { ts: '2026-05-15T10:02:00Z', skill: 's', script: 'c', ok: false, exit_code: 124, output: 'killed' }, { ts: '2026-05-15T10:03:00Z', skill: 's', script: 'd', ok: true, exit_code: 0, output: 'Error: not found, falling back' }, { ts: '2026-05-15T10:04:00Z', skill: 's', script: 'e', ok: false, exit_code: 1, output: ' at someFunc (/path/file.js:10)' }, { ts: '2026-05-15T10:05:00Z', skill: 's', script: 'f', ok: false, exit_code: 1, output: 'Traceback (most recent call last)\n File "x"' });
18
+ const failures = (0, telemetry_scan_1.scanFailures)(tmpTelemetry);
19
+ expect(failures).toHaveLength(3);
20
+ expect(failures.map(f => f.script)).toEqual(['b', 'e', 'f']);
21
+ });
22
+ test('scanFailures respects sinceDate filter', () => {
23
+ writeLines({ ts: '2026-05-10T00:00:00Z', skill: 's', script: 'old', ok: false, exit_code: 1, output: 'Error: x' }, { ts: '2026-05-15T00:00:00Z', skill: 's', script: 'new', ok: false, exit_code: 1, output: 'Error: y' });
24
+ const failures = (0, telemetry_scan_1.scanFailures)(tmpTelemetry, new Date('2026-05-12T00:00:00Z'));
25
+ expect(failures).toHaveLength(1);
26
+ expect(failures[0]?.script).toBe('new');
27
+ });
28
+ test('scanFailures handles missing file gracefully', () => {
29
+ const failures = (0, telemetry_scan_1.scanFailures)('/nonexistent/path.jsonl');
30
+ expect(failures).toEqual([]);
31
+ });
32
+ //# sourceMappingURL=telemetry-scan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-scan.test.js","sourceRoot":"","sources":["../../tests/telemetry-scan.test.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,7 @@ var require_constants = __commonJS({
34
34
  return mod && mod.__esModule ? mod : { "default": mod };
35
35
  };
36
36
  Object.defineProperty(exports2, "__esModule", { value: true });
37
- exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.TYPE_TO_DIR = exports2.PRIORITY_CASE = exports2.RELATED_OVERFETCH = exports2.MAX_RELATED_SOURCES = exports2.RELATION_PRIORITY = exports2.SYMMETRIC_TYPES = exports2.RELATION_TYPES = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
37
+ exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.TELEMETRY_FILE_ROTATE_BYTES = exports2.TELEMETRY_OUTPUT_MAX_BYTES = exports2.TELEMETRY_FILENAME = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.CC_PLUGIN_CACHE_DIR = exports2.TYPE_TO_DIR = exports2.PRIORITY_CASE = exports2.RELATED_OVERFETCH = exports2.MAX_RELATED_SOURCES = exports2.RELATION_PRIORITY = exports2.SYMMETRIC_TYPES = exports2.RELATION_TYPES = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
38
38
  exports2.isKnownHookEvent = isKnownHookEvent;
39
39
  exports2.isSessionCategory = isSessionCategory;
40
40
  exports2.fixVersionTokens = fixVersionTokens;
@@ -42,6 +42,9 @@ var require_constants = __commonJS({
42
42
  exports2.getActiveMindloreDir = getActiveMindloreDir;
43
43
  exports2.getAllDbs = getAllDbs;
44
44
  exports2.getProjectName = getProjectName;
45
+ exports2.resolveProject = resolveProject;
46
+ exports2.resolveMindloreHome = resolveMindloreHome;
47
+ exports2.resolveTelemetryPath = resolveTelemetryPath;
45
48
  exports2.log = log;
46
49
  exports2.isContentFile = isContentFile;
47
50
  exports2.resolveHookCommon = resolveHookCommon;
@@ -352,6 +355,7 @@ var require_constants = __commonJS({
352
355
  reference: "memory",
353
356
  note: "memory"
354
357
  };
358
+ exports2.CC_PLUGIN_CACHE_DIR = path_12.default.join(os_12.default.homedir(), ".claude", "plugins", "cache");
355
359
  exports2.CC_MEMORY_PATH_MARKER = path_12.default.join(".claude", "projects");
356
360
  exports2.CC_MEMORY_DIR = "memory";
357
361
  exports2.CC_MEMORY_CATEGORY = "cc-memory";
@@ -373,6 +377,20 @@ var require_constants = __commonJS({
373
377
  function getProjectName() {
374
378
  return path_12.default.basename(process.cwd());
375
379
  }
380
+ function resolveProject() {
381
+ if (process.env.MINDLORE_PROJECT)
382
+ return process.env.MINDLORE_PROJECT;
383
+ return getProjectName().toLowerCase();
384
+ }
385
+ function resolveMindloreHome() {
386
+ return process.env.MINDLORE_HOME ?? path_12.default.join(os_12.default.homedir(), exports2.MINDLORE_DIR);
387
+ }
388
+ exports2.TELEMETRY_FILENAME = "telemetry.jsonl";
389
+ exports2.TELEMETRY_OUTPUT_MAX_BYTES = 4e3;
390
+ exports2.TELEMETRY_FILE_ROTATE_BYTES = 10 * 1024 * 1024;
391
+ function resolveTelemetryPath() {
392
+ return process.env.MINDLORE_TELEMETRY_PATH ?? path_12.default.join(resolveMindloreHome(), exports2.TELEMETRY_FILENAME);
393
+ }
376
394
  function log(msg) {
377
395
  console.log(` ${msg}`);
378
396
  }
@@ -34,7 +34,7 @@ var require_constants = __commonJS({
34
34
  return mod && mod.__esModule ? mod : { "default": mod };
35
35
  };
36
36
  Object.defineProperty(exports2, "__esModule", { value: true });
37
- exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.TYPE_TO_DIR = exports2.PRIORITY_CASE = exports2.RELATED_OVERFETCH = exports2.MAX_RELATED_SOURCES = exports2.RELATION_PRIORITY = exports2.SYMMETRIC_TYPES = exports2.RELATION_TYPES = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
37
+ exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.TELEMETRY_FILE_ROTATE_BYTES = exports2.TELEMETRY_OUTPUT_MAX_BYTES = exports2.TELEMETRY_FILENAME = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.CC_PLUGIN_CACHE_DIR = exports2.TYPE_TO_DIR = exports2.PRIORITY_CASE = exports2.RELATED_OVERFETCH = exports2.MAX_RELATED_SOURCES = exports2.RELATION_PRIORITY = exports2.SYMMETRIC_TYPES = exports2.RELATION_TYPES = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
38
38
  exports2.isKnownHookEvent = isKnownHookEvent;
39
39
  exports2.isSessionCategory = isSessionCategory;
40
40
  exports2.fixVersionTokens = fixVersionTokens;
@@ -42,6 +42,9 @@ var require_constants = __commonJS({
42
42
  exports2.getActiveMindloreDir = getActiveMindloreDir;
43
43
  exports2.getAllDbs = getAllDbs;
44
44
  exports2.getProjectName = getProjectName;
45
+ exports2.resolveProject = resolveProject;
46
+ exports2.resolveMindloreHome = resolveMindloreHome;
47
+ exports2.resolveTelemetryPath = resolveTelemetryPath;
45
48
  exports2.log = log;
46
49
  exports2.isContentFile = isContentFile;
47
50
  exports2.resolveHookCommon = resolveHookCommon;
@@ -352,6 +355,7 @@ var require_constants = __commonJS({
352
355
  reference: "memory",
353
356
  note: "memory"
354
357
  };
358
+ exports2.CC_PLUGIN_CACHE_DIR = path_12.default.join(os_12.default.homedir(), ".claude", "plugins", "cache");
355
359
  exports2.CC_MEMORY_PATH_MARKER = path_12.default.join(".claude", "projects");
356
360
  exports2.CC_MEMORY_DIR = "memory";
357
361
  exports2.CC_MEMORY_CATEGORY = "cc-memory";
@@ -373,6 +377,20 @@ var require_constants = __commonJS({
373
377
  function getProjectName() {
374
378
  return path_12.default.basename(process.cwd());
375
379
  }
380
+ function resolveProject() {
381
+ if (process.env.MINDLORE_PROJECT)
382
+ return process.env.MINDLORE_PROJECT;
383
+ return getProjectName().toLowerCase();
384
+ }
385
+ function resolveMindloreHome() {
386
+ return process.env.MINDLORE_HOME ?? path_12.default.join(os_12.default.homedir(), exports2.MINDLORE_DIR);
387
+ }
388
+ exports2.TELEMETRY_FILENAME = "telemetry.jsonl";
389
+ exports2.TELEMETRY_OUTPUT_MAX_BYTES = 4e3;
390
+ exports2.TELEMETRY_FILE_ROTATE_BYTES = 10 * 1024 * 1024;
391
+ function resolveTelemetryPath() {
392
+ return process.env.MINDLORE_TELEMETRY_PATH ?? path_12.default.join(resolveMindloreHome(), exports2.TELEMETRY_FILENAME);
393
+ }
376
394
  function log(msg) {
377
395
  console.log(` ${msg}`);
378
396
  }
@@ -3,7 +3,7 @@
3
3
  const EPISODE_KINDS = [
4
4
  'session', 'decision', 'event', 'preference',
5
5
  'learning', 'friction', 'discovery', 'nomination',
6
- 'session-summary'
6
+ 'session-summary', 'skill_failure'
7
7
  ];
8
8
 
9
9
  function isValidKind(kind) {
@@ -0,0 +1,70 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const { parseFrontmatter, hookLog } = require('./mindlore-common.cjs');
4
+
5
+ const MAX_LESSONS = 10;
6
+ const MAX_LINES_PER_LESSON = 5;
7
+ const TOTAL_CHAR_BUDGET = 6000;
8
+
9
+ function summarizeLesson(body, relPath) {
10
+ const lines = body.split('\n');
11
+ const h2Idx = lines.findIndex(l => l.startsWith('## '));
12
+ const start = h2Idx >= 0 ? h2Idx : 0;
13
+ const slice = lines.slice(start, start + MAX_LINES_PER_LESSON).join('\n');
14
+ const rest = lines.slice(start + MAX_LINES_PER_LESSON).length > 0
15
+ ? `\n… (full: ${relPath})`
16
+ : '';
17
+ return slice + rest;
18
+ }
19
+
20
+ function loadLearningsBlock(mindloreDir, currentProject) {
21
+ const learningsDir = path.join(mindloreDir, 'learnings');
22
+ if (!fs.existsSync(learningsDir)) return '';
23
+ const files = fs.readdirSync(learningsDir).filter(f => f.endsWith('.md'));
24
+ if (files.length === 0) return '';
25
+
26
+ const stats = [];
27
+ for (const f of files) {
28
+ const abs = path.join(learningsDir, f);
29
+ try {
30
+ const stat = fs.statSync(abs);
31
+ stats.push({ file: f, abs, mtime: stat.mtimeMs });
32
+ } catch (err) {
33
+ hookLog('learnings-loader', 'warn', `stat skipped ${f}: ${err.message}`);
34
+ }
35
+ }
36
+ stats.sort((a, b) => b.mtime - a.mtime);
37
+
38
+ const candidates = [];
39
+ for (const s of stats) {
40
+ if (candidates.length >= MAX_LESSONS) break;
41
+ let raw;
42
+ try { raw = fs.readFileSync(s.abs, 'utf8'); } catch (err) {
43
+ hookLog('learnings-loader', 'warn', `read skipped ${s.file}: ${err.message}`);
44
+ continue;
45
+ }
46
+ const { meta, body } = parseFrontmatter(raw);
47
+ const project = meta.project || 'global';
48
+ if (project !== 'global' && project !== currentProject) continue;
49
+ candidates.push({
50
+ relPath: `.mindlore/learnings/${s.file}`,
51
+ body,
52
+ });
53
+ }
54
+
55
+ if (candidates.length === 0) return '';
56
+
57
+ let block = '[Mindlore Learnings]\n';
58
+ let used = block.length;
59
+ let count = 0;
60
+ for (const c of candidates) {
61
+ const piece = summarizeLesson(c.body, c.relPath) + '\n\n';
62
+ if (used + piece.length > TOTAL_CHAR_BUDGET && count > 0) break;
63
+ block += piece;
64
+ used += piece.length;
65
+ count++;
66
+ }
67
+ return block.trimEnd();
68
+ }
69
+
70
+ module.exports = { loadLearningsBlock };
@@ -26,6 +26,10 @@ function globalDir() {
26
26
  return path.join(os.homedir(), MINDLORE_DIR);
27
27
  }
28
28
 
29
+ function resolveMindloreHome() {
30
+ return globalDir();
31
+ }
32
+
29
33
  // Convenience export — snapshot at load time for simple references.
30
34
  const GLOBAL_MINDLORE_DIR = globalDir();
31
35
 
@@ -804,6 +808,7 @@ module.exports = {
804
808
  MINDLORE_DIR,
805
809
  GLOBAL_MINDLORE_DIR,
806
810
  globalDir,
811
+ resolveMindloreHome,
807
812
  DB_NAME,
808
813
  SKIP_FILES,
809
814
  findMindloreDir,
@@ -0,0 +1,29 @@
1
+ const REFLECT_THRESHOLD_DAYS = 7;
2
+ const NUDGE_COOLDOWN_HOURS = 24;
3
+
4
+ function isValidDate(iso) {
5
+ if (!iso) return false;
6
+ const d = new Date(iso);
7
+ return !isNaN(d.getTime());
8
+ }
9
+
10
+ function shouldNudgeReflect(lastReflectIso, lastNudgeIso, now = new Date()) {
11
+ let needsReflect;
12
+ if (!lastReflectIso) {
13
+ needsReflect = true;
14
+ } else if (!isValidDate(lastReflectIso)) {
15
+ return false;
16
+ } else {
17
+ const daysSince = (now.getTime() - new Date(lastReflectIso).getTime()) / 86400000;
18
+ needsReflect = daysSince >= REFLECT_THRESHOLD_DAYS;
19
+ }
20
+ if (!needsReflect) return false;
21
+
22
+ if (lastNudgeIso && isValidDate(lastNudgeIso)) {
23
+ const hoursSinceNudge = (now.getTime() - new Date(lastNudgeIso).getTime()) / 3600000;
24
+ if (hoursSinceNudge < NUDGE_COOLDOWN_HOURS) return false;
25
+ }
26
+ return true;
27
+ }
28
+
29
+ module.exports = { shouldNudgeReflect, REFLECT_THRESHOLD_DAYS, NUDGE_COOLDOWN_HOURS };
@@ -0,0 +1,12 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
4
+ function getSyncScripts(hooksDir) {
5
+ if (!fs.existsSync(hooksDir)) return [];
6
+ return fs.readdirSync(hooksDir)
7
+ .filter(f => f.startsWith('mindlore-') && f.endsWith('.cjs'))
8
+ .map(f => path.join(hooksDir, f))
9
+ .sort();
10
+ }
11
+
12
+ module.exports = { getSyncScripts };
@@ -26,6 +26,43 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
 
29
+ // node_modules/sqlite-vec/index.cjs
30
+ var require_sqlite_vec = __commonJS({
31
+ "node_modules/sqlite-vec/index.cjs"(exports2, module2) {
32
+ var { arch, platform } = require("node:process");
33
+ var BASE_PACKAGE_NAME = "sqlite-vec";
34
+ var ENTRYPOINT_BASE_NAME = "vec0";
35
+ var supportedPlatforms = [["darwin", "x64"], ["linux", "x64"], ["darwin", "arm64"], ["win32", "x64"], ["linux", "arm64"]];
36
+ var invalidPlatformErrorMessage = `Unsupported platform for ${BASE_PACKAGE_NAME}, on a ${platform}-${arch} machine. Supported platforms are (${supportedPlatforms.map(([p, a]) => `${p}-${a}`).join(",")}). Consult the ${BASE_PACKAGE_NAME} NPM package README for details.`;
37
+ function validPlatform(platform2, arch2) {
38
+ return supportedPlatforms.find(([p, a]) => platform2 === p && arch2 === a) !== void 0;
39
+ }
40
+ function extensionSuffix(platform2) {
41
+ if (platform2 === "win32") return "dll";
42
+ if (platform2 === "darwin") return "dylib";
43
+ return "so";
44
+ }
45
+ function platformPackageName(platform2, arch2) {
46
+ const os = platform2 === "win32" ? "windows" : platform2;
47
+ return `${BASE_PACKAGE_NAME}-${os}-${arch2}`;
48
+ }
49
+ function getLoadablePath() {
50
+ if (!validPlatform(platform, arch)) {
51
+ throw new Error(
52
+ invalidPlatformErrorMessage
53
+ );
54
+ }
55
+ const packageName = platformPackageName(platform, arch);
56
+ const loadablePath = require.resolve(packageName + "/" + ENTRYPOINT_BASE_NAME + "." + extensionSuffix(platform));
57
+ return loadablePath;
58
+ }
59
+ function load(db) {
60
+ db.loadExtension(getLoadablePath());
61
+ }
62
+ module2.exports = { getLoadablePath, load };
63
+ }
64
+ });
65
+
29
66
  // dist/scripts/lib/constants.js
30
67
  var require_constants = __commonJS({
31
68
  "dist/scripts/lib/constants.js"(exports2) {
@@ -34,7 +71,7 @@ var require_constants = __commonJS({
34
71
  return mod && mod.__esModule ? mod : { "default": mod };
35
72
  };
36
73
  Object.defineProperty(exports2, "__esModule", { value: true });
37
- exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.TYPE_TO_DIR = exports2.PRIORITY_CASE = exports2.RELATED_OVERFETCH = exports2.MAX_RELATED_SOURCES = exports2.RELATION_PRIORITY = exports2.SYMMETRIC_TYPES = exports2.RELATION_TYPES = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
74
+ exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.TELEMETRY_FILE_ROTATE_BYTES = exports2.TELEMETRY_OUTPUT_MAX_BYTES = exports2.TELEMETRY_FILENAME = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.CC_PLUGIN_CACHE_DIR = exports2.TYPE_TO_DIR = exports2.PRIORITY_CASE = exports2.RELATED_OVERFETCH = exports2.MAX_RELATED_SOURCES = exports2.RELATION_PRIORITY = exports2.SYMMETRIC_TYPES = exports2.RELATION_TYPES = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
38
75
  exports2.isKnownHookEvent = isKnownHookEvent;
39
76
  exports2.isSessionCategory = isSessionCategory;
40
77
  exports2.fixVersionTokens = fixVersionTokens;
@@ -42,6 +79,9 @@ var require_constants = __commonJS({
42
79
  exports2.getActiveMindloreDir = getActiveMindloreDir;
43
80
  exports2.getAllDbs = getAllDbs2;
44
81
  exports2.getProjectName = getProjectName;
82
+ exports2.resolveProject = resolveProject;
83
+ exports2.resolveMindloreHome = resolveMindloreHome;
84
+ exports2.resolveTelemetryPath = resolveTelemetryPath;
45
85
  exports2.log = log;
46
86
  exports2.isContentFile = isContentFile;
47
87
  exports2.resolveHookCommon = resolveHookCommon;
@@ -352,6 +392,7 @@ var require_constants = __commonJS({
352
392
  reference: "memory",
353
393
  note: "memory"
354
394
  };
395
+ exports2.CC_PLUGIN_CACHE_DIR = path_1.default.join(os_1.default.homedir(), ".claude", "plugins", "cache");
355
396
  exports2.CC_MEMORY_PATH_MARKER = path_1.default.join(".claude", "projects");
356
397
  exports2.CC_MEMORY_DIR = "memory";
357
398
  exports2.CC_MEMORY_CATEGORY = "cc-memory";
@@ -373,6 +414,20 @@ var require_constants = __commonJS({
373
414
  function getProjectName() {
374
415
  return path_1.default.basename(process.cwd());
375
416
  }
417
+ function resolveProject() {
418
+ if (process.env.MINDLORE_PROJECT)
419
+ return process.env.MINDLORE_PROJECT;
420
+ return getProjectName().toLowerCase();
421
+ }
422
+ function resolveMindloreHome() {
423
+ return process.env.MINDLORE_HOME ?? path_1.default.join(os_1.default.homedir(), exports2.MINDLORE_DIR);
424
+ }
425
+ exports2.TELEMETRY_FILENAME = "telemetry.jsonl";
426
+ exports2.TELEMETRY_OUTPUT_MAX_BYTES = 4e3;
427
+ exports2.TELEMETRY_FILE_ROTATE_BYTES = 10 * 1024 * 1024;
428
+ function resolveTelemetryPath() {
429
+ return process.env.MINDLORE_TELEMETRY_PATH ?? path_1.default.join(resolveMindloreHome(), exports2.TELEMETRY_FILENAME);
430
+ }
376
431
  function log(msg) {
377
432
  console.log(` ${msg}`);
378
433
  }
@@ -415,6 +470,43 @@ var require_constants = __commonJS({
415
470
  var require_db_helpers = __commonJS({
416
471
  "dist/scripts/lib/db-helpers.js"(exports2) {
417
472
  "use strict";
473
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
474
+ if (k2 === void 0) k2 = k;
475
+ var desc = Object.getOwnPropertyDescriptor(m, k);
476
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
477
+ desc = { enumerable: true, get: function() {
478
+ return m[k];
479
+ } };
480
+ }
481
+ Object.defineProperty(o, k2, desc);
482
+ }) : (function(o, m, k, k2) {
483
+ if (k2 === void 0) k2 = k;
484
+ o[k2] = m[k];
485
+ }));
486
+ var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
487
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
488
+ }) : function(o, v) {
489
+ o["default"] = v;
490
+ });
491
+ var __importStar = exports2 && exports2.__importStar || /* @__PURE__ */ (function() {
492
+ var ownKeys = function(o) {
493
+ ownKeys = Object.getOwnPropertyNames || function(o2) {
494
+ var ar = [];
495
+ for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
496
+ return ar;
497
+ };
498
+ return ownKeys(o);
499
+ };
500
+ return function(mod) {
501
+ if (mod && mod.__esModule) return mod;
502
+ var result = {};
503
+ if (mod != null) {
504
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
505
+ }
506
+ __setModuleDefault(result, mod);
507
+ return result;
508
+ };
509
+ })();
418
510
  var __importDefault = exports2 && exports2.__importDefault || function(mod) {
419
511
  return mod && mod.__esModule ? mod : { "default": mod };
420
512
  };
@@ -426,6 +518,7 @@ var require_db_helpers = __commonJS({
426
518
  exports2.openDatabaseTs = openDatabaseTs;
427
519
  var better_sqlite3_1 = __importDefault(require("better-sqlite3"));
428
520
  var fs_1 = __importDefault(require("fs"));
521
+ var vec = __importStar(require_sqlite_vec());
429
522
  var constants_js_1 = require_constants();
430
523
  function dbGet(db, sql, ...params) {
431
524
  const result = db.prepare(sql).get(...params);
@@ -465,6 +558,9 @@ var require_db_helpers = __commonJS({
465
558
  db.pragma("journal_mode = WAL");
466
559
  db.pragma(`busy_timeout = ${constants_js_1.DB_BUSY_TIMEOUT_MS}`);
467
560
  }
561
+ if (options?.loadVec) {
562
+ vec.load(db);
563
+ }
468
564
  return db;
469
565
  } catch {
470
566
  return null;
@@ -5,6 +5,38 @@ var __commonJS = (cb, mod) => function __require() {
5
5
  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
6
6
  };
7
7
 
8
+ // hooks/lib/reflect-trigger.cjs
9
+ var require_reflect_trigger = __commonJS({
10
+ "hooks/lib/reflect-trigger.cjs"(exports2, module2) {
11
+ "use strict";
12
+ var REFLECT_THRESHOLD_DAYS = 7;
13
+ var NUDGE_COOLDOWN_HOURS = 24;
14
+ function isValidDate(iso) {
15
+ if (!iso) return false;
16
+ const d = new Date(iso);
17
+ return !isNaN(d.getTime());
18
+ }
19
+ function shouldNudgeReflect2(lastReflectIso, lastNudgeIso, now = /* @__PURE__ */ new Date()) {
20
+ let needsReflect;
21
+ if (!lastReflectIso) {
22
+ needsReflect = true;
23
+ } else if (!isValidDate(lastReflectIso)) {
24
+ return false;
25
+ } else {
26
+ const daysSince = (now.getTime() - new Date(lastReflectIso).getTime()) / 864e5;
27
+ needsReflect = daysSince >= REFLECT_THRESHOLD_DAYS;
28
+ }
29
+ if (!needsReflect) return false;
30
+ if (lastNudgeIso && isValidDate(lastNudgeIso)) {
31
+ const hoursSinceNudge = (now.getTime() - new Date(lastNudgeIso).getTime()) / 36e5;
32
+ if (hoursSinceNudge < NUDGE_COOLDOWN_HOURS) return false;
33
+ }
34
+ return true;
35
+ }
36
+ module2.exports = { shouldNudgeReflect: shouldNudgeReflect2, REFLECT_THRESHOLD_DAYS, NUDGE_COOLDOWN_HOURS };
37
+ }
38
+ });
39
+
8
40
  // dist/scripts/lib/session-payload.js
9
41
  var require_session_payload = __commonJS({
10
42
  "dist/scripts/lib/session-payload.js"(exports2) {
@@ -30,7 +62,7 @@ var require_session_payload = __commonJS({
30
62
  const dedupClause = sessionId ? "AND rowid NOT IN (SELECT episode_id FROM episode_inject_log WHERE session_id = ?)" : "";
31
63
  const query = `SELECT rowid, kind, summary, created_at FROM episodes
32
64
  WHERE status = 'active' AND project = ?
33
- AND kind IN ('decision', 'friction', 'learning')
65
+ AND kind IN ('decision', 'friction')
34
66
  AND created_at >= ?
35
67
  ${dedupClause}
36
68
  ORDER BY kind, created_at DESC`;
@@ -46,18 +78,17 @@ var require_session_payload = __commonJS({
46
78
  }
47
79
  })();
48
80
  }
49
- const grouped = { decision: [], friction: [], learning: [] };
81
+ const grouped = { decision: [], friction: [] };
50
82
  for (const row of rows) {
51
83
  const kind = row.kind;
52
- if (kind === "decision" || kind === "friction" || kind === "learning") {
84
+ if (kind === "decision" || kind === "friction") {
53
85
  grouped[kind].push(row);
54
86
  }
55
87
  }
56
88
  const fmt = (items, limit) => items.slice(0, limit).map((r) => `- ${r.summary} (${r.created_at.slice(0, 10)})`).join("\n");
57
89
  return {
58
90
  decisions: grouped.decision.length > 0 ? fmt(grouped.decision, 5) : "No recent decisions.",
59
- friction: grouped.friction.length > 0 ? fmt(grouped.friction, 3) : "No active friction points.",
60
- learnings: grouped.learning.length > 0 ? fmt(grouped.learning, 5) : "No recent learnings."
91
+ friction: grouped.friction.length > 0 ? fmt(grouped.friction, 3) : "No active friction points."
61
92
  };
62
93
  }
63
94
  function buildSessionPayload(opts) {
@@ -68,7 +99,6 @@ var require_session_payload = __commonJS({
68
99
  const episodes = buildEpisodeSections(db, project, sessionId);
69
100
  sections.push({ label: "Decisions", content: episodes.decisions, tokens: estimateTokens(episodes.decisions) });
70
101
  sections.push({ label: "Friction", content: episodes.friction, tokens: estimateTokens(episodes.friction) });
71
- sections.push({ label: "Learnings", content: episodes.learnings, tokens: estimateTokens(episodes.learnings) });
72
102
  try {
73
103
  const summaries = db.prepare(`SELECT session_summary, created_at FROM episodes
74
104
  WHERE kind = 'session-summary' AND project = ? AND session_summary IS NOT NULL
@@ -585,7 +615,9 @@ var require_all_migrations = __commonJS({
585
615
  // hooks/src/mindlore-session-focus.cjs
586
616
  var fs = require("fs");
587
617
  var path = require("path");
588
- var { findMindloreDir, readConfig, openDatabase, hasEpisodesTable, querySupersededChains, formatSupersededChains, hookLog, getProjectName, parseFrontmatter, withTelemetry, withTimeoutDb, listSnapshots, isCorruptionError, recoverCorruptDb, getNominationCounts } = require("./lib/mindlore-common.cjs");
618
+ var { findMindloreDir, readConfig, openDatabase, hasEpisodesTable, querySupersededChains, formatSupersededChains, hookLog, getProjectName, parseFrontmatter, withTelemetry, withTimeoutDb, listSnapshots, isCorruptionError, recoverCorruptDb, getNominationCounts, resolveMindloreHome } = require("./lib/mindlore-common.cjs");
619
+ var { loadLearningsBlock } = require("./lib/learnings-loader.cjs");
620
+ var { shouldNudgeReflect } = require_reflect_trigger();
589
621
  function truncateSection(content, sectionRegex, keepCount, label) {
590
622
  const match = content.match(sectionRegex);
591
623
  if (!match) return content;
@@ -602,7 +634,7 @@ function truncateChangedFiles(content) {
602
634
  return truncateSection(content, /(## Changed Files\n)((?:- [^\n]+\n?)+)/, 10, "dosya");
603
635
  }
604
636
  function tryOpenDb(dbPath) {
605
- return openDatabase(dbPath, { readonly: true });
637
+ return openDatabase(dbPath, { readonly: false }) || openDatabase(dbPath, { readonly: true });
606
638
  }
607
639
  function getEpisodeStats(db, config, project) {
608
640
  const chains = querySupersededChains(db, { project, days: 7, limit: 5 });
@@ -610,8 +642,11 @@ function getEpisodeStats(db, config, project) {
610
642
  try {
611
643
  const rawCount = withTimeoutDb(
612
644
  db,
613
- "SELECT COUNT(*) as cnt FROM episodes WHERE consolidation_status = 'raw' OR consolidation_status IS NULL",
614
- [],
645
+ `SELECT COUNT(*) as cnt FROM episodes
646
+ WHERE (consolidation_status = 'raw' OR consolidation_status IS NULL)
647
+ AND kind IN ('learning','discovery','friction','decision','nomination')
648
+ AND project = ?`,
649
+ [project],
615
650
  { mode: "get" }
616
651
  );
617
652
  const cnt = rawCount?.cnt ?? 0;
@@ -669,6 +704,9 @@ ${formatSupersededChains(chains)}`);
669
704
  timings.db_stale = Date.now() - tStale;
670
705
  try {
671
706
  const counts = getNominationCounts(db, project);
707
+ if (counts.staged > 0) {
708
+ output.push(`[Mindlore Nomination] ${counts.staged} karar bekliyor \u2014 /mindlore-reflect ile onayla`);
709
+ }
672
710
  if (counts.staged >= (config?.graduation?.reflectThreshold ?? 5)) {
673
711
  output.push(`[Mindlore] ${counts.staged} bekleyen nomination var \u2014 \`/mindlore-reflect\` \xE7al\u0131\u015Ft\u0131r`);
674
712
  }
@@ -766,6 +804,24 @@ ${truncateChangedFiles(truncateCommits(deltaContent))}`);
766
804
  }
767
805
  timings.schema_check = Date.now() - tSchema;
768
806
  loadDbContent({ db, baseDir, config, output, timings, latestDeltaContent, sessionId });
807
+ try {
808
+ const reflectRow = db.prepare(
809
+ "SELECT value FROM skill_memory WHERE skill_name = 'mindlore-reflect' AND key = 'last_reflect_date'"
810
+ ).get();
811
+ const nudgeRow = db.prepare(
812
+ "SELECT value FROM skill_memory WHERE skill_name = 'mindlore-reflect' AND key = 'last_nudge_date'"
813
+ ).get();
814
+ if (shouldNudgeReflect(reflectRow?.value ?? null, nudgeRow?.value ?? null, /* @__PURE__ */ new Date())) {
815
+ output.push("[Mindlore] 7+ g\xFCn reflect yap\u0131lmad\u0131 \u2014 `/mindlore-reflect` \xE7al\u0131\u015Ft\u0131r");
816
+ const nowIso = (/* @__PURE__ */ new Date()).toISOString();
817
+ db.prepare(`
818
+ INSERT INTO skill_memory (skill_name, key, value, updated_at)
819
+ VALUES ('mindlore-reflect', 'last_nudge_date', ?, ?)
820
+ ON CONFLICT(skill_name, key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at
821
+ `).run(nowIso, nowIso);
822
+ }
823
+ } catch (_err) {
824
+ }
769
825
  } catch (err) {
770
826
  if (isCorruptionError(err)) {
771
827
  recoverCorruptDb(db, dbPath, "session-focus");
@@ -782,6 +838,16 @@ ${truncateChangedFiles(truncateCommits(deltaContent))}`);
782
838
  const outputLenAfterDb = output.reduce((s, o) => s + o.length, 0);
783
839
  sourceChars += outputLenAfterDb - outputLenBeforeDb;
784
840
  timings.db_total = Date.now() - tDb;
841
+ try {
842
+ const mindloreDir = resolveMindloreHome();
843
+ const project = getProjectName();
844
+ const learningsBlock = loadLearningsBlock(mindloreDir, project);
845
+ if (learningsBlock) {
846
+ output.push(learningsBlock);
847
+ sourceChars += learningsBlock.length;
848
+ }
849
+ } catch (_err) {
850
+ }
785
851
  timings.total = Date.now() - t0;
786
852
  hookLog("session-focus", "info", `timings: ${JSON.stringify(timings)}`);
787
853
  const budgetConfig = config?.tokenBudget ?? {};
@@ -26,6 +26,10 @@ function globalDir() {
26
26
  return path.join(os.homedir(), MINDLORE_DIR);
27
27
  }
28
28
 
29
+ function resolveMindloreHome() {
30
+ return globalDir();
31
+ }
32
+
29
33
  // Convenience export — snapshot at load time for simple references.
30
34
  const GLOBAL_MINDLORE_DIR = globalDir();
31
35
 
@@ -773,6 +777,7 @@ module.exports = {
773
777
  MINDLORE_DIR,
774
778
  GLOBAL_MINDLORE_DIR,
775
779
  globalDir,
780
+ resolveMindloreHome,
776
781
  DB_NAME,
777
782
  SKIP_FILES,
778
783
  findMindloreDir,