mindlore 0.3.5 → 0.4.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 (52) hide show
  1. package/README.md +9 -6
  2. package/dist/scripts/init.js +9 -1
  3. package/dist/scripts/init.js.map +1 -1
  4. package/dist/scripts/lib/episodes.d.ts +66 -0
  5. package/dist/scripts/lib/episodes.d.ts.map +1 -0
  6. package/dist/scripts/lib/episodes.js +180 -0
  7. package/dist/scripts/lib/episodes.js.map +1 -0
  8. package/dist/scripts/mindlore-episodes.d.ts +12 -0
  9. package/dist/scripts/mindlore-episodes.d.ts.map +1 -0
  10. package/dist/scripts/mindlore-episodes.js +193 -0
  11. package/dist/scripts/mindlore-episodes.js.map +1 -0
  12. package/dist/tests/diary.test.d.ts +6 -0
  13. package/dist/tests/diary.test.d.ts.map +1 -0
  14. package/dist/tests/diary.test.js +169 -0
  15. package/dist/tests/diary.test.js.map +1 -0
  16. package/dist/tests/episodes-inject.test.d.ts +6 -0
  17. package/dist/tests/episodes-inject.test.d.ts.map +1 -0
  18. package/dist/tests/episodes-inject.test.js +161 -0
  19. package/dist/tests/episodes-inject.test.js.map +1 -0
  20. package/dist/tests/episodes.test.d.ts +5 -0
  21. package/dist/tests/episodes.test.d.ts.map +1 -0
  22. package/dist/tests/episodes.test.js +254 -0
  23. package/dist/tests/episodes.test.js.map +1 -0
  24. package/dist/tests/helpers/db.d.ts +7 -0
  25. package/dist/tests/helpers/db.d.ts.map +1 -1
  26. package/dist/tests/helpers/db.js +20 -1
  27. package/dist/tests/helpers/db.js.map +1 -1
  28. package/dist/tests/nomination.test.d.ts +2 -0
  29. package/dist/tests/nomination.test.d.ts.map +1 -0
  30. package/dist/tests/nomination.test.js +94 -0
  31. package/dist/tests/nomination.test.js.map +1 -0
  32. package/dist/tests/session-focus.test.js +82 -0
  33. package/dist/tests/session-focus.test.js.map +1 -1
  34. package/dist/tests/supersedes-chain.test.d.ts +2 -0
  35. package/dist/tests/supersedes-chain.test.d.ts.map +1 -0
  36. package/dist/tests/supersedes-chain.test.js +109 -0
  37. package/dist/tests/supersedes-chain.test.js.map +1 -0
  38. package/hooks/lib/mindlore-common.cjs +260 -1
  39. package/hooks/mindlore-index.cjs +17 -14
  40. package/hooks/mindlore-post-read.cjs +11 -2
  41. package/hooks/mindlore-pre-compact.cjs +2 -2
  42. package/hooks/mindlore-read-guard.cjs +12 -4
  43. package/hooks/mindlore-search.cjs +39 -1
  44. package/hooks/mindlore-session-end.cjs +105 -22
  45. package/hooks/mindlore-session-focus.cjs +56 -2
  46. package/package.json +1 -1
  47. package/plugin.json +8 -8
  48. package/skills/mindlore-evolve/SKILL.md +8 -4
  49. package/skills/mindlore-explore/SKILL.md +8 -4
  50. package/skills/mindlore-log/SKILL.md +134 -17
  51. package/skills/mindlore-query/SKILL.md +8 -5
  52. package/templates/config.json +5 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mindlore-episodes.js","sourceRoot":"","sources":["../../scripts/mindlore-episodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Diary mode tests — v0.4.0 episode extraction.
3
+ * Tests the diary workflow: find bare session → extract enriched episodes.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=diary.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diary.test.d.ts","sourceRoot":"","sources":["../../tests/diary.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ /**
3
+ * Diary mode tests — v0.4.0 episode extraction.
4
+ * Tests the diary workflow: find bare session → extract enriched episodes.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const db_js_1 = require("./helpers/db.js");
8
+ const episodes_js_1 = require("../scripts/lib/episodes.js");
9
+ const { insertBareEpisode, queryRecentEpisodes, } = require('../hooks/lib/mindlore-common.cjs');
10
+ let env;
11
+ let db;
12
+ beforeEach(() => {
13
+ env = (0, db_js_1.createEpisodesTestEnv)('diary');
14
+ db = env.db;
15
+ });
16
+ afterEach(() => {
17
+ (0, db_js_1.destroyEpisodesTestEnv)(env);
18
+ });
19
+ describe('episode kinds', () => {
20
+ test('includes friction and discovery', () => {
21
+ expect(episodes_js_1.EPISODE_KINDS).toContain('friction');
22
+ expect(episodes_js_1.EPISODE_KINDS).toContain('discovery');
23
+ });
24
+ test('all 8 kinds are present', () => {
25
+ expect(episodes_js_1.EPISODE_KINDS).toHaveLength(8);
26
+ expect([...episodes_js_1.EPISODE_KINDS]).toEqual([
27
+ 'session', 'decision', 'event', 'preference', 'learning', 'friction', 'discovery', 'nomination',
28
+ ]);
29
+ });
30
+ test('can create episodes with friction kind', () => {
31
+ const ep = (0, episodes_js_1.createEpisode)(db, {
32
+ kind: 'friction',
33
+ summary: 'PostToolUse stdout hook output goes to debug log',
34
+ source: 'diary',
35
+ project: 'mindlore',
36
+ });
37
+ expect(ep.kind).toBe('friction');
38
+ expect(ep.status).toBe('active');
39
+ });
40
+ test('can create episodes with discovery kind', () => {
41
+ const ep = (0, episodes_js_1.createEpisode)(db, {
42
+ kind: 'discovery',
43
+ summary: 'PostToolUse if koşulu CC dispatcher tarafından değerlendirilmiyor',
44
+ source: 'diary',
45
+ project: 'mindlore',
46
+ });
47
+ expect(ep.kind).toBe('discovery');
48
+ });
49
+ });
50
+ describe('diary workflow: bare session → enriched episodes', () => {
51
+ test('diary episodes link to parent session via parent_id', () => {
52
+ // Step 1: session-end hook writes bare episode
53
+ const sessionId = insertBareEpisode(db, {
54
+ kind: 'session',
55
+ summary: 'Session: abc1234 feat: episodes (3 files)',
56
+ body: '## Commits\n- abc1234 feat: episodes\n## Changed Files\n- episodes.ts',
57
+ project: 'mindlore',
58
+ source: 'hook',
59
+ });
60
+ // Step 2: diary mode extracts enriched episodes
61
+ const decision = (0, episodes_js_1.createEpisode)(db, {
62
+ kind: 'decision',
63
+ summary: 'SQLite episodes tablosu > JSONL',
64
+ body: '## Reason\nQuery gücü ve FTS5 entegrasyonu.',
65
+ parent_id: sessionId,
66
+ source: 'diary',
67
+ project: 'mindlore',
68
+ });
69
+ const friction = (0, episodes_js_1.createEpisode)(db, {
70
+ kind: 'friction',
71
+ summary: 'PostToolUse hook stdout debug log\'a gidiyor',
72
+ parent_id: sessionId,
73
+ source: 'diary',
74
+ project: 'mindlore',
75
+ });
76
+ // Verify parent linkage
77
+ expect(decision.parent_id).toBe(sessionId);
78
+ expect(friction.parent_id).toBe(sessionId);
79
+ // Verify all episodes exist
80
+ const all = (0, episodes_js_1.queryEpisodes)(db, { project: 'mindlore' });
81
+ expect(all).toHaveLength(3); // session + decision + friction
82
+ });
83
+ test('diary episodes have source: diary', () => {
84
+ const sessionId = insertBareEpisode(db, {
85
+ kind: 'session',
86
+ summary: 'Session',
87
+ project: 'mindlore',
88
+ source: 'hook',
89
+ });
90
+ (0, episodes_js_1.createEpisode)(db, {
91
+ kind: 'learning',
92
+ summary: 'ctx_execute_file kullan',
93
+ parent_id: sessionId,
94
+ source: 'diary',
95
+ project: 'mindlore',
96
+ });
97
+ const diaryEps = (0, episodes_js_1.queryEpisodes)(db, { source: 'diary', project: 'mindlore' });
98
+ expect(diaryEps).toHaveLength(1);
99
+ expect(diaryEps[0].source).toBe('diary');
100
+ });
101
+ test('finding latest bare session for diary analysis', () => {
102
+ // Simulate multiple sessions
103
+ db.prepare(`INSERT INTO episodes (id, kind, scope, project, summary, status, source, created_at)
104
+ VALUES ('ep-old', 'session', 'project', 'mindlore', 'Old session', 'active', 'hook', '2026-04-12T10:00:00.000Z')`).run();
105
+ db.prepare(`INSERT INTO episodes (id, kind, scope, project, summary, status, source, created_at)
106
+ VALUES ('ep-new', 'session', 'project', 'mindlore', 'Latest session', 'active', 'hook', '2026-04-13T15:00:00.000Z')`).run();
107
+ // Query like diary would: find latest session episode
108
+ const sessions = queryRecentEpisodes(db, { project: 'mindlore', limit: 1 });
109
+ expect(sessions).toHaveLength(1);
110
+ expect(sessions[0].summary).toBe('Latest session');
111
+ });
112
+ });
113
+ describe('deduplication rule', () => {
114
+ test('each finding maps to exactly one kind — no duplicates', () => {
115
+ const sessionId = insertBareEpisode(db, {
116
+ kind: 'session',
117
+ summary: 'Test session',
118
+ project: 'mindlore',
119
+ source: 'hook',
120
+ });
121
+ // Simulate diary extracting findings with priority rule:
122
+ // decision > discovery > friction > learning > preference > event
123
+ const findings = [
124
+ { kind: 'decision', summary: 'SQLite over JSONL' },
125
+ { kind: 'discovery', summary: 'PostToolUse if doesnt work' },
126
+ { kind: 'friction', summary: 'Hook stdout format confusion' },
127
+ { kind: 'learning', summary: 'Use additionalContext JSON' },
128
+ ];
129
+ for (const f of findings) {
130
+ (0, episodes_js_1.createEpisode)(db, {
131
+ ...f,
132
+ parent_id: sessionId,
133
+ source: 'diary',
134
+ project: 'mindlore',
135
+ });
136
+ }
137
+ // Each finding has unique kind+summary — no duplicates
138
+ const all = (0, episodes_js_1.queryEpisodes)(db, { source: 'diary', project: 'mindlore' });
139
+ const summaries = all.map(e => e.summary);
140
+ const uniqueSummaries = new Set(summaries);
141
+ expect(summaries.length).toBe(uniqueSummaries.size);
142
+ });
143
+ });
144
+ describe('reflect input: episodes query', () => {
145
+ test('reflect can query active episodes from hook and diary sources', () => {
146
+ insertBareEpisode(db, { kind: 'session', summary: 'S1', project: 'mindlore', source: 'hook' });
147
+ (0, episodes_js_1.createEpisode)(db, { kind: 'friction', summary: 'F1', source: 'diary', project: 'mindlore' });
148
+ (0, episodes_js_1.createEpisode)(db, { kind: 'learning', summary: 'L1', source: 'reflect', project: 'mindlore' });
149
+ // Reflect should read hook + diary episodes (not its own output)
150
+ const hookEps = (0, episodes_js_1.queryEpisodes)(db, { source: 'hook', project: 'mindlore' });
151
+ const diaryEps = (0, episodes_js_1.queryEpisodes)(db, { source: 'diary', project: 'mindlore' });
152
+ const reflectInput = [...hookEps, ...diaryEps];
153
+ expect(reflectInput).toHaveLength(2);
154
+ expect(reflectInput.some(e => e.source === 'reflect')).toBe(false);
155
+ });
156
+ test('reflect filters by date range', () => {
157
+ db.prepare(`INSERT INTO episodes (id, kind, scope, project, summary, status, source, created_at)
158
+ VALUES ('ep-old', 'friction', 'project', 'mindlore', 'Old friction', 'active', 'diary', '2026-04-01T10:00:00.000Z')`).run();
159
+ db.prepare(`INSERT INTO episodes (id, kind, scope, project, summary, status, source, created_at)
160
+ VALUES ('ep-recent', 'friction', 'project', 'mindlore', 'Recent friction', 'active', 'diary', '2026-04-13T10:00:00.000Z')`).run();
161
+ const lastWeek = (0, episodes_js_1.queryEpisodes)(db, {
162
+ project: 'mindlore',
163
+ since: '2026-04-06T00:00:00.000Z',
164
+ });
165
+ expect(lastWeek).toHaveLength(1);
166
+ expect(lastWeek[0].summary).toBe('Recent friction');
167
+ });
168
+ });
169
+ //# sourceMappingURL=diary.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diary.test.js","sourceRoot":"","sources":["../../tests/diary.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Episodes injection + hook helper tests — v0.4.0
3
+ * Tests session-focus episode injection and session-end bare episode writing.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=episodes-inject.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episodes-inject.test.d.ts","sourceRoot":"","sources":["../../tests/episodes-inject.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /**
3
+ * Episodes injection + hook helper tests — v0.4.0
4
+ * Tests session-focus episode injection and session-end bare episode writing.
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const path_1 = __importDefault(require("path"));
11
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
12
+ const db_js_1 = require("./helpers/db.js");
13
+ const episodes_js_1 = require("../scripts/lib/episodes.js");
14
+ const { ensureEpisodesTable, hasEpisodesTable, insertBareEpisode, queryRecentEpisodes, } = require('../hooks/lib/mindlore-common.cjs');
15
+ let env;
16
+ let db;
17
+ beforeEach(() => {
18
+ env = (0, db_js_1.createEpisodesTestEnv)('inject');
19
+ db = env.db;
20
+ });
21
+ afterEach(() => {
22
+ (0, db_js_1.destroyEpisodesTestEnv)(env);
23
+ });
24
+ describe('session-focus episode injection', () => {
25
+ test('queryRecentEpisodes returns episodes ordered by created_at DESC', () => {
26
+ // Insert with explicit timestamps to guarantee order
27
+ db.prepare(`INSERT INTO episodes (id, kind, scope, project, summary, status, source, created_at)
28
+ VALUES ('ep-1', 'session', 'project', 'mindlore', 'First session', 'active', 'hook', '2026-04-13T10:00:00.000Z')`).run();
29
+ db.prepare(`INSERT INTO episodes (id, kind, scope, project, summary, status, source, created_at)
30
+ VALUES ('ep-2', 'decision', 'project', 'mindlore', 'Chose SQLite', 'active', 'diary', '2026-04-13T11:00:00.000Z')`).run();
31
+ db.prepare(`INSERT INTO episodes (id, kind, scope, project, summary, status, source, created_at)
32
+ VALUES ('ep-3', 'learning', 'project', 'mindlore', 'Use ctx_execute_file', 'active', 'reflect', '2026-04-13T12:00:00.000Z')`).run();
33
+ const episodes = queryRecentEpisodes(db, { project: 'mindlore', limit: 3 });
34
+ expect(episodes).toHaveLength(3);
35
+ // Most recent first
36
+ expect(episodes[0].summary).toBe('Use ctx_execute_file');
37
+ expect(episodes[2].summary).toBe('First session');
38
+ });
39
+ test('queryRecentEpisodes respects limit', () => {
40
+ for (let i = 0; i < 5; i++) {
41
+ insertBareEpisode(db, { kind: 'session', summary: `Session ${i}`, project: 'mindlore' });
42
+ }
43
+ const limited = queryRecentEpisodes(db, { project: 'mindlore', limit: 3 });
44
+ expect(limited).toHaveLength(3);
45
+ });
46
+ test('queryRecentEpisodes filters by project', () => {
47
+ insertBareEpisode(db, { kind: 'session', summary: 'Mindlore session', project: 'mindlore' });
48
+ insertBareEpisode(db, { kind: 'session', summary: 'Kastell session', project: 'kastell' });
49
+ const mindlore = queryRecentEpisodes(db, { project: 'mindlore' });
50
+ expect(mindlore).toHaveLength(1);
51
+ expect(mindlore[0].summary).toBe('Mindlore session');
52
+ });
53
+ test('queryRecentEpisodes only returns active episodes', () => {
54
+ insertBareEpisode(db, { kind: 'session', summary: 'Active', project: 'mindlore' });
55
+ insertBareEpisode(db, { kind: 'session', summary: 'Will delete', project: 'mindlore' });
56
+ // Soft-delete second one
57
+ db.prepare("UPDATE episodes SET status = 'deleted' WHERE summary = 'Will delete'").run();
58
+ const episodes = queryRecentEpisodes(db, { project: 'mindlore' });
59
+ expect(episodes).toHaveLength(1);
60
+ expect(episodes[0].summary).toBe('Active');
61
+ });
62
+ test('episode summary format matches inject expectation', () => {
63
+ insertBareEpisode(db, {
64
+ kind: 'decision',
65
+ summary: 'Type safety enforcement için as yerine helper pattern',
66
+ project: 'mindlore',
67
+ source: 'diary',
68
+ });
69
+ const episodes = queryRecentEpisodes(db, { project: 'mindlore', limit: 3 });
70
+ const ep = episodes[0];
71
+ // Verify shape matches what session-focus inject needs
72
+ expect(ep).toHaveProperty('kind');
73
+ expect(ep).toHaveProperty('summary');
74
+ expect(ep).toHaveProperty('created_at');
75
+ // Format like session-focus would
76
+ const date = String(ep['created_at']).slice(0, 10);
77
+ const line = `- [${date}] ${ep['kind']}: ${String(ep['summary']).slice(0, 100)}`;
78
+ expect(line).toContain('decision');
79
+ expect(line).toContain('Type safety');
80
+ });
81
+ });
82
+ describe('session-end bare episode', () => {
83
+ test('insertBareEpisode creates session episode with commit info', () => {
84
+ const commits = ['abc1234 feat: add episodes', 'def5678 fix: type error'];
85
+ const files = ['scripts/lib/episodes.ts', 'tests/episodes.test.ts'];
86
+ const summary = `Session: ${commits.join(', ')} (${files.length} files)`.slice(0, 300);
87
+ const body = [
88
+ '## Commits\n' + commits.map(c => `- ${c}`).join('\n'),
89
+ '## Changed Files\n' + files.map(f => `- ${f}`).join('\n'),
90
+ ].join('\n\n');
91
+ const id = insertBareEpisode(db, {
92
+ kind: 'session',
93
+ scope: 'project',
94
+ project: 'mindlore',
95
+ summary,
96
+ body,
97
+ tags: 'session',
98
+ entities: files,
99
+ source: 'hook',
100
+ });
101
+ expect(id).toMatch(/^ep-/);
102
+ const ep = (0, episodes_js_1.getEpisode)(db, id);
103
+ expect(ep).toBeDefined();
104
+ expect(ep.kind).toBe('session');
105
+ expect(ep.source).toBe('hook');
106
+ expect(ep.project).toBe('mindlore');
107
+ expect(ep.body).toContain('## Commits');
108
+ expect(ep.body).toContain('episodes.ts');
109
+ const entities = JSON.parse(ep.entities);
110
+ expect(entities).toEqual(files);
111
+ });
112
+ test('bare episode with no commits', () => {
113
+ const id = insertBareEpisode(db, {
114
+ kind: 'session',
115
+ project: 'mindlore',
116
+ summary: 'Session: no commits (0 files)',
117
+ source: 'hook',
118
+ });
119
+ const ep = (0, episodes_js_1.getEpisode)(db, id);
120
+ expect(ep).toBeDefined();
121
+ expect(ep.summary).toBe('Session: no commits (0 files)');
122
+ expect(ep.entities).toBeNull();
123
+ });
124
+ test('bare episode with read stats in body', () => {
125
+ const body = '## Read Stats\n- 15 files read, 3 repeated';
126
+ const id = insertBareEpisode(db, {
127
+ kind: 'session',
128
+ project: 'mindlore',
129
+ summary: 'Session with reads',
130
+ body,
131
+ source: 'hook',
132
+ });
133
+ const ep = (0, episodes_js_1.getEpisode)(db, id);
134
+ expect(ep).toBeDefined();
135
+ expect(ep.body).toContain('15 files read');
136
+ });
137
+ });
138
+ describe('episodes table migration', () => {
139
+ test('ensureEpisodesTable on fresh DB creates table', () => {
140
+ const freshPath = path_1.default.join(env.tmpDir, 'fresh.db');
141
+ const freshDb = new better_sqlite3_1.default(freshPath);
142
+ freshDb.pragma('journal_mode = WAL');
143
+ expect(hasEpisodesTable(freshDb)).toBe(false);
144
+ ensureEpisodesTable(freshDb);
145
+ expect(hasEpisodesTable(freshDb)).toBe(true);
146
+ // Can insert after creation
147
+ const id = insertBareEpisode(freshDb, { kind: 'session', summary: 'Test', project: 'test' });
148
+ expect(id).toMatch(/^ep-/);
149
+ freshDb.close();
150
+ });
151
+ test('ensureEpisodesTable is idempotent on existing table', () => {
152
+ ensureEpisodesTable(db);
153
+ ensureEpisodesTable(db);
154
+ // Data still intact
155
+ insertBareEpisode(db, { kind: 'session', summary: 'Before', project: 'test' });
156
+ ensureEpisodesTable(db);
157
+ const rows = queryRecentEpisodes(db, { project: 'test' });
158
+ expect(rows).toHaveLength(1);
159
+ });
160
+ });
161
+ //# sourceMappingURL=episodes-inject.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episodes-inject.test.js","sourceRoot":"","sources":["../../tests/episodes-inject.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Episodes CRUD tests — v0.4.0 episodic memory.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=episodes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episodes.test.d.ts","sourceRoot":"","sources":["../../tests/episodes.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}