mindlore 0.6.5 → 0.6.7

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 (79) hide show
  1. package/README.md +1 -1
  2. package/dist/scripts/init.js +34 -16
  3. package/dist/scripts/init.js.map +1 -1
  4. package/dist/scripts/lib/all-migrations.d.ts +6 -0
  5. package/dist/scripts/lib/all-migrations.d.ts.map +1 -0
  6. package/dist/scripts/lib/all-migrations.js +35 -0
  7. package/dist/scripts/lib/all-migrations.js.map +1 -0
  8. package/dist/scripts/lib/migrations-v066.d.ts +4 -0
  9. package/dist/scripts/lib/migrations-v066.d.ts.map +1 -0
  10. package/dist/scripts/lib/migrations-v066.js +14 -0
  11. package/dist/scripts/lib/migrations-v066.js.map +1 -0
  12. package/dist/scripts/lib/migrations-v067.d.ts +7 -0
  13. package/dist/scripts/lib/migrations-v067.d.ts.map +1 -0
  14. package/dist/scripts/lib/migrations-v067.js +50 -0
  15. package/dist/scripts/lib/migrations-v067.js.map +1 -0
  16. package/dist/scripts/lib/session-payload.d.ts +9 -1
  17. package/dist/scripts/lib/session-payload.d.ts.map +1 -1
  18. package/dist/scripts/lib/session-payload.js +25 -6
  19. package/dist/scripts/lib/session-payload.js.map +1 -1
  20. package/dist/scripts/mindlore-fts5-index.js +2 -5
  21. package/dist/scripts/mindlore-fts5-index.js.map +1 -1
  22. package/dist/tests/episodes-inject.test.js +71 -0
  23. package/dist/tests/episodes-inject.test.js.map +1 -1
  24. package/dist/tests/fts5.test.js +23 -0
  25. package/dist/tests/fts5.test.js.map +1 -1
  26. package/dist/tests/helpers/db.d.ts +1 -0
  27. package/dist/tests/helpers/db.d.ts.map +1 -1
  28. package/dist/tests/helpers/db.js +10 -1
  29. package/dist/tests/helpers/db.js.map +1 -1
  30. package/dist/tests/init.test.js +26 -0
  31. package/dist/tests/init.test.js.map +1 -1
  32. package/dist/tests/lesson-graduation.test.d.ts +2 -0
  33. package/dist/tests/lesson-graduation.test.d.ts.map +1 -0
  34. package/dist/tests/lesson-graduation.test.js +83 -0
  35. package/dist/tests/lesson-graduation.test.js.map +1 -0
  36. package/dist/tests/migrations-v063.test.js +1 -1
  37. package/dist/tests/migrations-v066.test.d.ts +2 -0
  38. package/dist/tests/migrations-v066.test.d.ts.map +1 -0
  39. package/dist/tests/migrations-v066.test.js +54 -0
  40. package/dist/tests/migrations-v066.test.js.map +1 -0
  41. package/dist/tests/migrations-v067.test.d.ts +2 -0
  42. package/dist/tests/migrations-v067.test.d.ts.map +1 -0
  43. package/dist/tests/migrations-v067.test.js +115 -0
  44. package/dist/tests/migrations-v067.test.js.map +1 -0
  45. package/dist/tests/obsidian.test.js +2 -1
  46. package/dist/tests/obsidian.test.js.map +1 -1
  47. package/dist/tests/session-end-cleanup.test.d.ts +2 -0
  48. package/dist/tests/session-end-cleanup.test.d.ts.map +1 -0
  49. package/dist/tests/session-end-cleanup.test.js +76 -0
  50. package/dist/tests/session-end-cleanup.test.js.map +1 -0
  51. package/dist/tests/session-focus-helpers.test.d.ts +2 -0
  52. package/dist/tests/session-focus-helpers.test.d.ts.map +1 -0
  53. package/dist/tests/session-focus-helpers.test.js +80 -0
  54. package/dist/tests/session-focus-helpers.test.js.map +1 -0
  55. package/dist/tests/session-focus.test.js +111 -10
  56. package/dist/tests/session-focus.test.js.map +1 -1
  57. package/dist/tests/session-payload.test.js +10 -10
  58. package/dist/tests/session-payload.test.js.map +1 -1
  59. package/dist/tests/session-summary.test.js +1 -1
  60. package/dist/tests/session-summary.test.js.map +1 -1
  61. package/dist/tests/stats-skill.test.d.ts +2 -0
  62. package/dist/tests/stats-skill.test.d.ts.map +1 -0
  63. package/dist/tests/stats-skill.test.js +55 -0
  64. package/dist/tests/stats-skill.test.js.map +1 -0
  65. package/hooks/lib/mindlore-common.cjs +38 -0
  66. package/hooks/mindlore-search.cjs +2 -1
  67. package/hooks/mindlore-session-end.cjs +4 -1
  68. package/hooks/mindlore-session-focus.cjs +93 -36
  69. package/package.json +1 -1
  70. package/plugin.json +6 -1
  71. package/skills/mindlore-ingest/SKILL.md +11 -0
  72. package/skills/mindlore-reflect/SKILL.md +10 -0
  73. package/skills/mindlore-stats/SKILL.md +106 -0
  74. package/templates/config.json +1 -1
  75. package/templates/extraction/article.md +15 -0
  76. package/templates/extraction/changelog.md +15 -0
  77. package/templates/extraction/default.md +15 -0
  78. package/templates/extraction/docs.md +15 -0
  79. package/templates/extraction/github-repo.md +17 -0
@@ -38,7 +38,7 @@ describe('buildSessionPayload', () => {
38
38
  insertEpisode('decision', 'Use TypeScript for all scripts');
39
39
  insertEpisode('friction', 'CI pipeline is slow');
40
40
  insertEpisode('learning', 'Always build before test');
41
- const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
41
+ const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
42
42
  expect(payload.sections).toHaveLength(4);
43
43
  expect(payload.sections[0].label).toBe('Session');
44
44
  expect(payload.sections[1].label).toBe('Decisions');
@@ -52,7 +52,7 @@ describe('buildSessionPayload', () => {
52
52
  insertEpisode('decision', 'Short decision');
53
53
  insertEpisode('friction', 'Short friction');
54
54
  insertEpisode('learning', 'Short learning');
55
- const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, 20);
55
+ const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT, tokenBudget: 20 });
56
56
  expect(payload.sections.length).toBeLessThan(4);
57
57
  expect(payload.sections[0].label).toBe('Session');
58
58
  expect(payload.totalTokens).toBeLessThanOrEqual(20);
@@ -62,15 +62,15 @@ describe('buildSessionPayload', () => {
62
62
  insertEpisode('decision', 'Dec');
63
63
  insertEpisode('friction', 'Fric');
64
64
  insertEpisode('learning', 'Learn');
65
- const full = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, 99999);
65
+ const full = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT, tokenBudget: 99999 });
66
66
  const sessionTokens = full.sections[0].tokens;
67
67
  const decisionTokens = full.sections[1].tokens;
68
68
  const budgetFor2 = sessionTokens + decisionTokens + 1;
69
- const trimmed = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, budgetFor2);
69
+ const trimmed = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT, tokenBudget: budgetFor2 });
70
70
  expect(trimmed.sections.map(s => s.label)).toEqual(['Session', 'Decisions']);
71
71
  });
72
72
  test('handles empty DB gracefully', () => {
73
- const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
73
+ const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
74
74
  expect(payload.sections).toHaveLength(4);
75
75
  expect(payload.sections[0].content).toContain('No previous session data');
76
76
  expect(payload.sections[1].content).toContain('No recent decisions');
@@ -79,7 +79,7 @@ describe('buildSessionPayload', () => {
79
79
  });
80
80
  test('handles missing diary directory', () => {
81
81
  insertEpisode('decision', 'A decision');
82
- const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
82
+ const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
83
83
  expect(payload.sections[0].label).toBe('Session');
84
84
  expect(payload.sections[0].content).toContain('No previous session data');
85
85
  expect(payload.sections).toHaveLength(4);
@@ -87,7 +87,7 @@ describe('buildSessionPayload', () => {
87
87
  test('token estimation is reasonable', () => {
88
88
  const text = 'abcd'; // 4 chars = 1 token
89
89
  writeDelta('delta-2026-04-19.md', `# H\n- ${text}`);
90
- const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
90
+ const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
91
91
  for (const section of payload.sections) {
92
92
  const expectedTokens = Math.ceil(section.content.length / 4);
93
93
  expect(section.tokens).toBe(expectedTokens);
@@ -98,14 +98,14 @@ describe('buildSessionPayload', () => {
98
98
  test('reads latest delta file when multiple exist', () => {
99
99
  writeDelta('delta-2026-04-18.md', '# Old\n- Old stuff');
100
100
  writeDelta('delta-2026-04-19.md', '# Latest\n- Latest stuff');
101
- const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
101
+ const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
102
102
  expect(payload.sections[0].content).toContain('Latest stuff');
103
103
  expect(payload.sections[0].content).not.toContain('Old stuff');
104
104
  });
105
105
  test('only returns episodes for matching project', () => {
106
106
  insertEpisode('decision', 'My project decision', { project: PROJECT });
107
107
  insertEpisode('decision', 'Other project decision', { project: 'other-project' });
108
- const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
108
+ const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
109
109
  expect(payload.sections[1].content).toContain('My project decision');
110
110
  expect(payload.sections[1].content).not.toContain('Other project decision');
111
111
  });
@@ -114,7 +114,7 @@ describe('buildSessionPayload', () => {
114
114
  insertEpisode('decision', 'Dec');
115
115
  insertEpisode('friction', 'Fric');
116
116
  insertEpisode('learning', 'Learn');
117
- const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, 1);
117
+ const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT, tokenBudget: 1 });
118
118
  expect(payload.sections).toHaveLength(1);
119
119
  expect(payload.sections[0].label).toBe('Session');
120
120
  });
@@ -1 +1 @@
1
- {"version":3,"file":"session-payload.test.js","sourceRoot":"","sources":["../../tests/session-payload.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-payload.test.js","sourceRoot":"","sources":["../../tests/session-payload.test.ts"],"names":[],"mappings":"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"}
@@ -118,7 +118,7 @@ describe('session summary → DB → payload integration', () => {
118
118
  const summary = 'Intent: v0.6.3 search engine | Son: commit atıldı';
119
119
  env.db.prepare(`INSERT INTO episodes (kind, scope, project, summary, session_summary, status, created_at)
120
120
  VALUES ('session-summary', 'project', 'test-proj', ?, ?, 'active', datetime('now'))`).run(summary, summary);
121
- const payload = (0, session_payload_js_1.buildSessionPayload)(env.db, env.tmpDir, 'test-proj', 5000);
121
+ const payload = (0, session_payload_js_1.buildSessionPayload)({ db: env.db, baseDir: env.tmpDir, project: 'test-proj', tokenBudget: 5000 });
122
122
  const pastSessions = payload.sections.find(s => s.label === 'Past Sessions');
123
123
  expect(pastSessions).toBeDefined();
124
124
  expect(pastSessions.content).toContain('v0.6.3 search engine');
@@ -1 +1 @@
1
- {"version":3,"file":"session-summary.test.js","sourceRoot":"","sources":["../../tests/session-summary.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-summary.test.js","sourceRoot":"","sources":["../../tests/session-summary.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stats-skill.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-skill.test.d.ts","sourceRoot":"","sources":["../../tests/stats-skill.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
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 fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const SKILL_DIR = path_1.default.join(__dirname, '..', 'skills', 'mindlore-stats');
9
+ const SKILL_FILE = path_1.default.join(SKILL_DIR, 'SKILL.md');
10
+ const PLUGIN_JSON = path_1.default.join(__dirname, '..', 'plugin.json');
11
+ describe('/mindlore-stats skill', () => {
12
+ let skillContent;
13
+ let pluginData;
14
+ beforeAll(() => {
15
+ skillContent = fs_1.default.readFileSync(SKILL_FILE, 'utf8');
16
+ pluginData = JSON.parse(fs_1.default.readFileSync(PLUGIN_JSON, 'utf8'));
17
+ });
18
+ test('skill directory exists', () => {
19
+ expect(fs_1.default.existsSync(SKILL_DIR)).toBe(true);
20
+ });
21
+ test('SKILL.md exists and is non-empty', () => {
22
+ expect(skillContent.length).toBeGreaterThan(100);
23
+ });
24
+ test('SKILL.md has valid frontmatter', () => {
25
+ expect(skillContent.startsWith('---')).toBe(true);
26
+ const endIdx = skillContent.indexOf('---', 3);
27
+ expect(endIdx).toBeGreaterThan(3);
28
+ const frontmatter = skillContent.slice(3, endIdx);
29
+ expect(frontmatter).toContain('name: mindlore-stats');
30
+ expect(frontmatter).toContain('description:');
31
+ });
32
+ test('SKILL.md specifies fork context', () => {
33
+ expect(skillContent).toContain('context: fork');
34
+ });
35
+ test('SKILL.md references telemetry.jsonl', () => {
36
+ expect(skillContent).toContain('telemetry.jsonl');
37
+ });
38
+ test('SKILL.md references mindlore.db', () => {
39
+ expect(skillContent).toContain('mindlore.db');
40
+ });
41
+ test('registered in plugin.json', () => {
42
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- pluginData parsed from JSON
43
+ const skills = pluginData.skills;
44
+ const statsSkill = skills.find(s => s.name === 'mindlore-stats' || s.path?.includes('mindlore-stats'));
45
+ expect(statsSkill).toBeDefined();
46
+ });
47
+ test('allowed-tools are restricted to read-only', () => {
48
+ const toolsMatch = skillContent.match(/allowed-tools:\s*\[([^\]]+)\]/);
49
+ expect(toolsMatch).toBeTruthy();
50
+ const tools = toolsMatch[1].split(',').map(t => t.trim());
51
+ expect(tools).not.toContain('Write');
52
+ expect(tools).not.toContain('Edit');
53
+ });
54
+ });
55
+ //# sourceMappingURL=stats-skill.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-skill.test.js","sourceRoot":"","sources":["../../tests/stats-skill.test.ts"],"names":[],"mappings":"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"}
@@ -749,6 +749,40 @@ function withTimeoutDb(db, sql, params = [], { timeoutMs = 3000, mode = 'all' }
749
749
  }
750
750
  }
751
751
 
752
+ function checkReflectTrigger(db, project, threshold) {
753
+ if (threshold === undefined) threshold = 5;
754
+ try {
755
+ const row = withTimeoutDb(db,
756
+ "SELECT COUNT(*) as cnt FROM episodes WHERE kind = 'nomination' AND status = 'staged' AND project = ?",
757
+ [project], { mode: 'get' });
758
+ const cnt = row?.cnt ?? 0;
759
+ if (cnt >= threshold) {
760
+ return `[Mindlore] ${cnt} bekleyen nomination var — \`/mindlore-reflect\` çalıştır`;
761
+ }
762
+ } catch (_err) { /* episodes table may not exist */ }
763
+ return null;
764
+ }
765
+
766
+ function cleanupExpiredInjectLog(db, ttlMs) {
767
+ if (ttlMs === undefined) ttlMs = 30 * 24 * 60 * 60 * 1000;
768
+ try {
769
+ const cutoff = new Date(Date.now() - ttlMs).toISOString();
770
+ const result = db.prepare('DELETE FROM episode_inject_log WHERE injected_at < ?').run(cutoff);
771
+ return result.changes;
772
+ } catch (_err) { /* table may not exist */ }
773
+ return 0;
774
+ }
775
+
776
+ function getGraduatedLessonCount(db, project) {
777
+ try {
778
+ const row = withTimeoutDb(db,
779
+ "SELECT COUNT(*) as cnt FROM episodes WHERE kind = 'nomination' AND status = 'approved' AND graduated_at IS NOT NULL AND project = ?",
780
+ [project], { mode: 'get' });
781
+ return row?.cnt ?? 0;
782
+ } catch (_err) { /* columns may not exist yet */ }
783
+ return 0;
784
+ }
785
+
752
786
  module.exports = {
753
787
  MINDLORE_DIR,
754
788
  GLOBAL_MINDLORE_DIR,
@@ -832,6 +866,10 @@ module.exports = {
832
866
  // DB corruption recovery (v0.6.3)
833
867
  isCorruptionError,
834
868
  recoverCorruptDb,
869
+ // Lesson graduation (v0.6.7)
870
+ checkReflectTrigger,
871
+ getGraduatedLessonCount,
872
+ cleanupExpiredInjectLog,
835
873
  };
836
874
 
837
875
  function isCorruptionError(err) {
@@ -151,7 +151,8 @@ function main() {
151
151
 
152
152
  const headingStr = headings.length > 0 ? `\nBasliklar: ${headings.join(', ')}` : '';
153
153
  const tagsStr = r.tags ? `\nTags: ${r.tags}` : '';
154
- const entry = `[Mindlore: ${category}/${title}] ${description}\nDosya: ${relativePath}${tagsStr}${headingStr}`;
154
+ const snippetOrDesc = r.snippet || description;
155
+ const entry = `[Mindlore: ${category}/${title}] ${snippetOrDesc}\nDosya: ${relativePath}${tagsStr}${headingStr}`;
155
156
  const truncated = entry.slice(0, perResultChars);
156
157
  totalUsed += truncated.length;
157
158
  output.push(truncated);
@@ -13,7 +13,7 @@ const fs = require('fs');
13
13
  const path = require('path');
14
14
  const os = require('os');
15
15
  const { execFileSync, spawn } = require('child_process');
16
- const { findMindloreDir, globalDir, getProjectName, openDatabase, ensureEpisodesTable, hasEpisodesTable, insertBareEpisode, insertFtsRow, hookLog, SHARED_EXPORT_DIRS, resolveWin32Bin, withTelemetry, getUnpromotedRawFiles } = require('./lib/mindlore-common.cjs');
16
+ const { findMindloreDir, globalDir, getProjectName, openDatabase, ensureEpisodesTable, hasEpisodesTable, insertBareEpisode, insertFtsRow, hookLog, SHARED_EXPORT_DIRS, resolveWin32Bin, withTelemetry, getUnpromotedRawFiles, cleanupExpiredInjectLog } = require('./lib/mindlore-common.cjs');
17
17
 
18
18
  const EXPORT_DIRS = SHARED_EXPORT_DIRS;
19
19
 
@@ -323,6 +323,9 @@ function writeBareEpisode(baseDir, project, commits, changedFiles, reads) {
323
323
  });
324
324
  writeBoth();
325
325
 
326
+ // TTL cleanup for episode_inject_log (R4)
327
+ try { cleanupExpiredInjectLog(db); } catch (_err) { /* cleanup is optional */ }
328
+
326
329
  db.close();
327
330
  } catch (err) {
328
331
  hookLog('session-end', 'error', `episode write failed: ${err?.message ?? err}`);
@@ -10,30 +10,65 @@
10
10
 
11
11
  const fs = require('fs');
12
12
  const path = require('path');
13
- const { findMindloreDir, readConfig, openDatabase, hasEpisodesTable, querySupersededChains, formatSupersededChains, hookLog, getProjectName, parseFrontmatter, withTelemetry, withTimeoutDb, listSnapshots, isCorruptionError, recoverCorruptDb } = require('./lib/mindlore-common.cjs');
13
+ const { findMindloreDir, readConfig, openDatabase, hasEpisodesTable, querySupersededChains, formatSupersededChains, hookLog, getProjectName, parseFrontmatter, withTelemetry, withTimeoutDb, listSnapshots, isCorruptionError, recoverCorruptDb, checkReflectTrigger, getGraduatedLessonCount } = require('./lib/mindlore-common.cjs');
14
+
15
+ function truncateSection(content, sectionRegex, keepCount, label) {
16
+ const match = content.match(sectionRegex);
17
+ if (!match) return content;
18
+ const lines = match[2].trim().split('\n');
19
+ if (lines.length <= keepCount) return content;
20
+ const kept = lines.slice(0, keepCount).join('\n');
21
+ return content.replace(match[2].trim(), kept + `\n- ...ve ${lines.length - keepCount} ${label} daha`);
22
+ }
14
23
 
15
24
  function truncateCommits(content) {
16
- const commitMatch = content.match(/(## Commits\n)((?:- [^\n]+\n?)+)/);
17
- if (!commitMatch) return content;
18
- const lines = commitMatch[2].trim().split('\n');
19
- if (lines.length <= 5) return content;
20
- const kept = lines.slice(0, 5).join('\n');
21
- const truncated = kept + `\n- ...ve ${lines.length - 5} commit daha`;
22
- return content.replace(commitMatch[2].trim(), truncated);
25
+ return truncateSection(content, /(## Commits\n)((?:- [^\n]+\n?)+)/, 5, 'commit');
26
+ }
27
+
28
+ function truncateChangedFiles(content) {
29
+ return truncateSection(content, /(## Changed Files\n)((?:- [^\n]+\n?)+)/, 10, 'dosya');
23
30
  }
24
31
 
25
32
  function tryOpenDb(dbPath) {
26
33
  return openDatabase(dbPath, { readonly: true });
27
34
  }
28
35
 
29
- function loadDbContent(db, baseDir, config, output, timings, latestDeltaContent) {
36
+ function getEpisodeStats(db, config, project) {
37
+ const chains = querySupersededChains(db, { project, days: 7, limit: 5 });
38
+ let consolidationMsg = null;
39
+ try {
40
+ const rawCount = withTimeoutDb(db,
41
+ "SELECT COUNT(*) as cnt FROM episodes WHERE consolidation_status = 'raw' OR consolidation_status IS NULL",
42
+ [], { mode: 'get' });
43
+ const cnt = rawCount?.cnt ?? 0;
44
+ const consolThreshold = config?.consolidation?.threshold ?? 50;
45
+ if (cnt >= consolThreshold) {
46
+ consolidationMsg = `[Mindlore] ${cnt} raw episode birikti — \`/mindlore-maintain consolidate\` ile birleştirmeyi düşün.`;
47
+ }
48
+ } catch (_err) { /* consolidation_status column may not exist yet */ }
49
+ return { chains, consolidationMsg };
50
+ }
51
+
52
+ function checkStaleContent(db) {
53
+ try {
54
+ const thirtyDaysAgo = new Date(Date.now() - (30 * 24 * 60 * 60 * 1000)).toISOString();
55
+ const row = withTimeoutDb(db, 'SELECT COUNT(*) as cnt FROM file_hashes WHERE last_indexed < ?', [thirtyDaysAgo], { mode: 'get' });
56
+ const staleCount = row?.cnt ?? 0;
57
+ if (staleCount > 3) {
58
+ return `[Mindlore: ${staleCount} dosya 30+ gundur guncellenmemis — \`/mindlore-evolve\` dusun]`;
59
+ }
60
+ } catch (_staleErr) { /* file_hashes may not exist */ }
61
+ return null;
62
+ }
63
+
64
+ function loadDbContent({ db, baseDir, config, output, timings, latestDeltaContent, sessionId }) {
65
+ const project = path.basename(process.cwd());
30
66
  // Session payload: Session summary, Decisions, Friction, Learnings
31
67
  const tPayload = Date.now();
32
68
  try {
33
69
  const { buildSessionPayload } = require('../dist/scripts/lib/session-payload.js');
34
- const project = path.basename(process.cwd());
35
70
  const payloadBudget = config?.tokenBudget?.sessionInject ?? 2000;
36
- const payload = buildSessionPayload(db, baseDir, project, payloadBudget, latestDeltaContent);
71
+ const payload = buildSessionPayload({ db, baseDir, project, tokenBudget: payloadBudget, latestDeltaContent, sessionId });
37
72
  for (const section of payload.sections) {
38
73
  output.push(`[Mindlore ${section.label}]\n${section.content}`);
39
74
  }
@@ -42,41 +77,40 @@ function loadDbContent(db, baseDir, config, output, timings, latestDeltaContent)
42
77
  }
43
78
  timings.db_payload = Date.now() - tPayload;
44
79
 
45
- // Supersedes chain display
80
+ // Supersedes chain display + episode consolidation reminder
46
81
  const tSuperseded = Date.now();
47
82
  if (hasEpisodesTable(db)) {
48
- const project = path.basename(process.cwd());
49
-
50
- const chains = querySupersededChains(db, { project, days: 7, limit: 5 });
83
+ const { chains, consolidationMsg } = getEpisodeStats(db, config, project);
51
84
  if (chains.length > 0) {
52
85
  output.push(`[Mindlore Supersedes]\n${formatSupersededChains(chains)}`);
53
86
  }
54
-
55
- // Episode consolidation reminder
56
- try {
57
- const rawCount = withTimeoutDb(db,
58
- "SELECT COUNT(*) as cnt FROM episodes WHERE consolidation_status = 'raw' OR consolidation_status IS NULL",
59
- [], { mode: 'get' });
60
- const cnt = rawCount?.cnt ?? 0;
61
- const consolThreshold = config?.consolidation?.threshold ?? 50;
62
- if (cnt >= consolThreshold) {
63
- output.push(`[Mindlore] ${cnt} raw episode birikti — \`/mindlore-maintain consolidate\` ile birleştirmeyi düşün.`);
64
- }
65
- } catch (_err) { /* consolidation_status column may not exist yet */ }
87
+ if (consolidationMsg) {
88
+ output.push(consolidationMsg);
89
+ }
66
90
  }
67
91
  timings.db_episodes = Date.now() - tSuperseded;
68
92
 
69
93
  // Stale content check
70
94
  const tStale = Date.now();
95
+ const staleMsg = checkStaleContent(db);
96
+ if (staleMsg) {
97
+ output.push(staleMsg);
98
+ }
99
+ timings.db_stale = Date.now() - tStale;
100
+
101
+ // Auto reflect trigger (Q1)
71
102
  try {
72
- const thirtyDaysAgo = new Date(Date.now() - (30 * 24 * 60 * 60 * 1000)).toISOString();
73
- const row = withTimeoutDb(db, 'SELECT COUNT(*) as cnt FROM file_hashes WHERE last_indexed < ?', [thirtyDaysAgo], { mode: 'get' });
74
- const staleCount = row?.cnt ?? 0;
75
- if (staleCount > 3) {
76
- output.push(`[Mindlore: ${staleCount} dosya 30+ gundur guncellenmemis \`/mindlore-evolve\` dusun]`);
103
+ const reflectMsg = checkReflectTrigger(db, project, config?.graduation?.reflectThreshold);
104
+ if (reflectMsg) output.push(reflectMsg);
105
+ } catch (_reflectErr) { /* graduation not available */ }
106
+
107
+ // Graduated lesson count (Q3 content lives in CLAUDE.md, only show count)
108
+ try {
109
+ const gradCount = getGraduatedLessonCount(db, project);
110
+ if (gradCount > 0) {
111
+ output.push(`[Mindlore] ${gradCount} graduated lesson aktif (detay: CLAUDE.md veya /mindlore-reflect)`);
77
112
  }
78
- } catch (_staleErr) { /* file_hashes may not exist */ }
79
- timings.db_stale = Date.now() - tStale;
113
+ } catch (_lessonErr) { /* graduation not available */ }
80
114
  }
81
115
 
82
116
  function main() {
@@ -84,6 +118,13 @@ function main() {
84
118
  const baseDir = findMindloreDir();
85
119
  if (!baseDir) return; // No .mindlore/ found, silently skip
86
120
 
121
+ // Read session_id from stdin (Claude Code passes { session_id } to SessionStart hooks)
122
+ let sessionId;
123
+ try {
124
+ const stdinData = JSON.parse(fs.readFileSync(0, 'utf8') || '{}');
125
+ sessionId = stdinData.session_id || undefined;
126
+ } catch { sessionId = undefined; }
127
+
87
128
  const output = [];
88
129
  const config = readConfig(baseDir);
89
130
  const timings = {};
@@ -117,7 +158,7 @@ function main() {
117
158
  const deltaProject = meta.project || null;
118
159
  const currentProject = getProjectName();
119
160
  if (!deltaProject || deltaProject.toLowerCase() === currentProject.toLowerCase()) {
120
- output.push(`[Mindlore Delta: ${latestName}]\n${truncateCommits(deltaContent)}`);
161
+ output.push(`[Mindlore Delta: ${latestName}]\n${truncateChangedFiles(truncateCommits(deltaContent))}`);
121
162
  }
122
163
  }
123
164
 
@@ -158,7 +199,19 @@ function main() {
158
199
 
159
200
  if (db) {
160
201
  try {
161
- loadDbContent(db, baseDir, config, output, timings, latestDeltaContent);
202
+ // Schema version check: warn if DB is behind expected version
203
+ const tSchema = Date.now();
204
+ try {
205
+ const { EXPECTED_SCHEMA_VERSION } = require('../dist/scripts/lib/all-migrations.js');
206
+ const row = db.prepare('SELECT MAX(version) as v FROM schema_versions').get();
207
+ const current = row?.v ?? 0;
208
+ if (current < EXPECTED_SCHEMA_VERSION) {
209
+ output.push(`[Mindlore: schema güncel değil (v${current} → v${EXPECTED_SCHEMA_VERSION}). \`npx mindlore upgrade\` çalıştır.]`);
210
+ }
211
+ } catch (_schemaErr) { /* schema_versions may not exist yet */ }
212
+ timings.schema_check = Date.now() - tSchema;
213
+
214
+ loadDbContent({ db, baseDir, config, output, timings, latestDeltaContent, sessionId });
162
215
  } catch (err) {
163
216
  if (isCorruptionError(err)) {
164
217
  recoverCorruptDb(db, dbPath, 'session-focus');
@@ -200,3 +253,7 @@ withTelemetry('mindlore-session-focus', main).catch(err => {
200
253
  hookLog('mindlore-session-focus', 'error', err?.message ?? String(err));
201
254
  process.exit(0);
202
255
  });
256
+
257
+ if (typeof module !== 'undefined') {
258
+ module.exports = { truncateCommits, truncateChangedFiles, getEpisodeStats, checkStaleContent };
259
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mindlore",
3
- "version": "0.6.5",
3
+ "version": "0.6.7",
4
4
  "description": "AI-native knowledge system for Claude Code",
5
5
  "type": "commonjs",
6
6
  "bin": {
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mindlore",
3
3
  "description": "AI-native knowledge system for Claude Code. Persistent, searchable, evolving knowledge base with FTS5.",
4
- "version": "0.6.5",
4
+ "version": "0.6.7",
5
5
  "skills": [
6
6
  {
7
7
  "name": "mindlore-ingest",
@@ -52,6 +52,11 @@
52
52
  "name": "mindlore-maintain",
53
53
  "path": "skills/mindlore-maintain/SKILL.md",
54
54
  "description": "KB maintenance — decay/archive stale documents, consolidate 50+ episodes into learnings/insights, detect contradictions. Modes: decay (stale doc archive with git snapshot), consolidate (episode→file promotion), contradictions (wiki-lint + semantic), restore (undo archive). Run without flags for full report."
55
+ },
56
+ {
57
+ "name": "mindlore-stats",
58
+ "path": "skills/mindlore-stats/SKILL.md",
59
+ "description": "Show context contribution and cost per session — hook calls, durations, DB stats."
55
60
  }
56
61
  ],
57
62
  "agents": [
@@ -135,6 +135,17 @@ Required frontmatter fields include `source_type` — auto-detected:
135
135
  - `pdf` for PDF Mode
136
136
  - `file` for File Mode
137
137
 
138
+ ### Extraction Template
139
+
140
+ After detecting `source_type`, check if a matching extraction template exists:
141
+
142
+ 1. Read `~/.mindlore/templates/extraction/{source_type}.md`
143
+ 2. If found, follow the "Extraction Instructions" section for source analysis
144
+ 3. If not found, Read `~/.mindlore/templates/extraction/default.md` and follow that
145
+ 4. User can override with `--type <type>` argument (e.g., `/mindlore-ingest https://example.com --type changelog`)
146
+
147
+ The template guides WHAT to extract from the source. Apply its instructions when writing the source summary in `sources/{slug}.md`.
148
+
138
149
  ## Quality Assessment
139
150
 
140
151
  Assign quality automatically during ingest using this heuristic:
@@ -95,8 +95,18 @@ Onaylamak istediklerini sec, veya 'skip':
95
95
  - `claude.md` -> project CLAUDE.md'ye kural ekle
96
96
  - `domain:{slug}` -> ilgili domain sayfasina ekle
97
97
 
98
+ Approval SQL:
99
+ ```sql
100
+ UPDATE episodes SET status = 'approved', graduated_at = datetime('now') WHERE id = ?
101
+ ```
102
+
98
103
  User rejects -> `status: staged -> rejected` + rejection reason
99
104
 
105
+ Rejection SQL:
106
+ ```sql
107
+ UPDATE episodes SET status = 'rejected', rejected_at = datetime('now'), rejection_reason = ? WHERE id = ?
108
+ ```
109
+
100
110
  ## On End — Write skill_memory
101
111
 
102
112
  ```bash