mindlore 0.4.0 → 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.
package/README.md CHANGED
@@ -184,7 +184,7 @@ Skills spawn subagents with `[mindlore:SKILL]` markers — the model-router hook
184
184
 
185
185
  ## Hooks
186
186
 
187
- 13 Claude Code lifecycle hooks (v0.4.0):
187
+ 13 Claude Code lifecycle hooks (v0.4.1):
188
188
 
189
189
  | Event | Hook | What it does |
190
190
  |-------|------|-------------|
@@ -1,17 +1,17 @@
1
1
  /**
2
2
  * Episodes CRUD helpers for Mindlore episodic memory.
3
- * v0.4.0: session/decision/event/preference/learning/friction/discovery episodes.
3
+ * v0.4.1: session/decision/event/preference/learning/friction/discovery/nomination episodes.
4
4
  *
5
5
  * Episodes live in a regular SQLite table (not FTS5) for structured queries.
6
6
  * Optionally mirrored to FTS5 for text search.
7
7
  */
8
8
  import type BetterSqlite3 from 'better-sqlite3';
9
9
  type Database = BetterSqlite3.Database;
10
- export declare const EPISODE_KINDS: readonly ["session", "decision", "event", "preference", "learning", "friction", "discovery"];
10
+ export declare const EPISODE_KINDS: readonly ["session", "decision", "event", "preference", "learning", "friction", "discovery", "nomination"];
11
11
  export type EpisodeKind = typeof EPISODE_KINDS[number];
12
12
  export declare const EPISODE_SCOPES: readonly ["project", "global"];
13
13
  export type EpisodeScope = typeof EPISODE_SCOPES[number];
14
- export declare const EPISODE_STATUSES: readonly ["active", "superseded", "deleted"];
14
+ export declare const EPISODE_STATUSES: readonly ["active", "superseded", "deleted", "staged", "reviewed", "approved", "rejected"];
15
15
  export type EpisodeStatus = typeof EPISODE_STATUSES[number];
16
16
  export declare const EPISODE_SOURCES: readonly ["hook", "diary", "reflect", "decide", "manual"];
17
17
  export type EpisodeSource = typeof EPISODE_SOURCES[number];
@@ -1 +1 @@
1
- {"version":3,"file":"episodes.d.ts","sourceRoot":"","sources":["../../../scripts/lib/episodes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAGhD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AAIvC,eAAO,MAAM,aAAa,8FAA+F,CAAC;AAC1H,MAAM,MAAM,WAAW,GAAG,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,cAAc,gCAAiC,CAAC;AAC7D,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,gBAAgB,8CAA+C,CAAC;AAC7E,MAAM,MAAM,aAAa,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,eAAe,2DAA4D,CAAC;AACzF,MAAM,MAAM,aAAa,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,eAAO,MAAM,mBAAmB,0kBAoB/B,CAAC;AAcF,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CA2C9E;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAExE;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,EAAE,CAwCtF;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAE5F;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAG/D;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpE;AAID,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAC/D,IAAI,CAcN;AAID,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAUtD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAMtD"}
1
+ {"version":3,"file":"episodes.d.ts","sourceRoot":"","sources":["../../../scripts/lib/episodes.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Episodes CRUD helpers for Mindlore episodic memory.
4
- * v0.4.0: session/decision/event/preference/learning/friction/discovery episodes.
4
+ * v0.4.1: session/decision/event/preference/learning/friction/discovery/nomination episodes.
5
5
  *
6
6
  * Episodes live in a regular SQLite table (not FTS5) for structured queries.
7
7
  * Optionally mirrored to FTS5 for text search.
@@ -23,9 +23,9 @@ exports.hasEpisodesTable = hasEpisodesTable;
23
23
  const crypto_1 = __importDefault(require("crypto"));
24
24
  const db_helpers_js_1 = require("./db-helpers.js");
25
25
  // ── Types ────────────────────────────────────────────────────────────
26
- exports.EPISODE_KINDS = ['session', 'decision', 'event', 'preference', 'learning', 'friction', 'discovery'];
26
+ exports.EPISODE_KINDS = ['session', 'decision', 'event', 'preference', 'learning', 'friction', 'discovery', 'nomination'];
27
27
  exports.EPISODE_SCOPES = ['project', 'global'];
28
- exports.EPISODE_STATUSES = ['active', 'superseded', 'deleted'];
28
+ exports.EPISODE_STATUSES = ['active', 'superseded', 'deleted', 'staged', 'reviewed', 'approved', 'rejected'];
29
29
  exports.EPISODE_SOURCES = ['hook', 'diary', 'reflect', 'decide', 'manual'];
30
30
  // ── SQL ──────────────────────────────────────────────────────────────
31
31
  // CO-EVOLUTION: Schema mirrors SQL_EPISODES_CREATE + SQL_EPISODES_INDEXES in hooks/lib/mindlore-common.cjs
@@ -1 +1 @@
1
- {"version":3,"file":"episodes.js","sourceRoot":"","sources":["../../../scripts/lib/episodes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"episodes.js","sourceRoot":"","sources":["../../../scripts/lib/episodes.ts"],"names":[],"mappings":"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"}
@@ -21,10 +21,10 @@ describe('episode kinds', () => {
21
21
  expect(episodes_js_1.EPISODE_KINDS).toContain('friction');
22
22
  expect(episodes_js_1.EPISODE_KINDS).toContain('discovery');
23
23
  });
24
- test('all 7 kinds are present', () => {
25
- expect(episodes_js_1.EPISODE_KINDS).toHaveLength(7);
24
+ test('all 8 kinds are present', () => {
25
+ expect(episodes_js_1.EPISODE_KINDS).toHaveLength(8);
26
26
  expect([...episodes_js_1.EPISODE_KINDS]).toEqual([
27
- 'session', 'decision', 'event', 'preference', 'learning', 'friction', 'discovery',
27
+ 'session', 'decision', 'event', 'preference', 'learning', 'friction', 'discovery', 'nomination',
28
28
  ]);
29
29
  });
30
30
  test('can create episodes with friction kind', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"diary.test.js","sourceRoot":"","sources":["../../tests/diary.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diary.test.js","sourceRoot":"","sources":["../../tests/diary.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=nomination.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nomination.test.d.ts","sourceRoot":"","sources":["../../tests/nomination.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const db_js_1 = require("./helpers/db.js");
4
+ const episodes_js_1 = require("../scripts/lib/episodes.js");
5
+ let env;
6
+ let db;
7
+ beforeEach(() => {
8
+ env = (0, db_js_1.createEpisodesTestEnv)('nomination');
9
+ db = env.db;
10
+ });
11
+ afterEach(() => {
12
+ (0, db_js_1.destroyEpisodesTestEnv)(env);
13
+ });
14
+ describe('nomination kind', () => {
15
+ test('EPISODE_KINDS includes nomination', () => {
16
+ expect(episodes_js_1.EPISODE_KINDS).toContain('nomination');
17
+ expect(episodes_js_1.EPISODE_KINDS).toHaveLength(8);
18
+ });
19
+ test('can create nomination episode', () => {
20
+ const ep = (0, episodes_js_1.createEpisode)(db, {
21
+ kind: 'nomination',
22
+ summary: 'Always use CO-EVOLUTION pattern for schema changes',
23
+ body: '## Target: learnings\n## Reason\n3x tekrar: episodes.ts + common.cjs sync hatası',
24
+ tags: 'co-evolution,schema',
25
+ source: 'reflect',
26
+ });
27
+ expect(ep.kind).toBe('nomination');
28
+ expect(ep.status).toBe('active');
29
+ });
30
+ });
31
+ describe('nomination statuses', () => {
32
+ test('EPISODE_STATUSES includes staged, reviewed, approved, rejected', () => {
33
+ expect(episodes_js_1.EPISODE_STATUSES).toContain('staged');
34
+ expect(episodes_js_1.EPISODE_STATUSES).toContain('reviewed');
35
+ expect(episodes_js_1.EPISODE_STATUSES).toContain('approved');
36
+ expect(episodes_js_1.EPISODE_STATUSES).toContain('rejected');
37
+ expect(episodes_js_1.EPISODE_STATUSES).toHaveLength(7);
38
+ });
39
+ test('can create nomination with staged status via DB', () => {
40
+ const ep = (0, episodes_js_1.createEpisode)(db, {
41
+ kind: 'nomination',
42
+ summary: 'Test rule nomination',
43
+ source: 'reflect',
44
+ });
45
+ db.prepare("UPDATE episodes SET status = 'staged' WHERE id = ?").run(ep.id);
46
+ const updated = (0, episodes_js_1.getEpisode)(db, ep.id);
47
+ expect(updated?.status).toBe('staged');
48
+ });
49
+ test('staged nominations are hidden from default query', () => {
50
+ (0, episodes_js_1.createEpisode)(db, {
51
+ kind: 'nomination',
52
+ summary: 'Staged nom',
53
+ source: 'reflect',
54
+ });
55
+ db.prepare("UPDATE episodes SET status = 'staged' WHERE kind = 'nomination'").run();
56
+ const results = (0, episodes_js_1.queryEpisodes)(db, {});
57
+ expect(results.filter(e => e.kind === 'nomination')).toHaveLength(0);
58
+ });
59
+ test('can query staged nominations explicitly', () => {
60
+ (0, episodes_js_1.createEpisode)(db, {
61
+ kind: 'nomination',
62
+ summary: 'Staged nom',
63
+ source: 'reflect',
64
+ });
65
+ db.prepare("UPDATE episodes SET status = 'staged' WHERE kind = 'nomination'").run();
66
+ const results = (0, episodes_js_1.queryEpisodes)(db, { kind: 'nomination', status: 'staged' });
67
+ expect(results).toHaveLength(1);
68
+ expect(results[0]?.status).toBe('staged');
69
+ });
70
+ test('nomination status transition: staged → approved', () => {
71
+ const ep = (0, episodes_js_1.createEpisode)(db, {
72
+ kind: 'nomination',
73
+ summary: 'Approved rule',
74
+ source: 'reflect',
75
+ });
76
+ db.prepare("UPDATE episodes SET status = 'staged' WHERE id = ?").run(ep.id);
77
+ db.prepare("UPDATE episodes SET status = 'approved' WHERE id = ?").run(ep.id);
78
+ const updated = (0, episodes_js_1.getEpisode)(db, ep.id);
79
+ expect(updated?.status).toBe('approved');
80
+ });
81
+ test('nomination status transition: staged → rejected', () => {
82
+ const ep = (0, episodes_js_1.createEpisode)(db, {
83
+ kind: 'nomination',
84
+ summary: 'Rejected rule',
85
+ body: '## Reason\nTest',
86
+ source: 'reflect',
87
+ });
88
+ db.prepare("UPDATE episodes SET status = 'staged' WHERE id = ?").run(ep.id);
89
+ db.prepare("UPDATE episodes SET status = 'rejected' WHERE id = ?").run(ep.id);
90
+ const updated = (0, episodes_js_1.getEpisode)(db, ep.id);
91
+ expect(updated?.status).toBe('rejected');
92
+ });
93
+ });
94
+ //# sourceMappingURL=nomination.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nomination.test.js","sourceRoot":"","sources":["../../tests/nomination.test.ts"],"names":[],"mappings":"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"}
@@ -118,4 +118,86 @@ describe('Session Focus Hook', () => {
118
118
  expect(output).not.toContain('[Mindlore Delta');
119
119
  });
120
120
  });
121
+ describe('enriched multi-session inject', () => {
122
+ const { queryMultiSessionEpisodes, formatMultiSessionEpisodes } = require('../hooks/lib/mindlore-common.cjs');
123
+ const { createEpisodesTestEnv, destroyEpisodesTestEnv } = require('./helpers/db.js');
124
+ const { createEpisode } = require('../scripts/lib/episodes.js');
125
+ let env;
126
+ let db;
127
+ beforeEach(() => {
128
+ env = createEpisodesTestEnv('multi-session');
129
+ db = env.db;
130
+ });
131
+ afterEach(() => {
132
+ destroyEpisodesTestEnv(env);
133
+ });
134
+ test('queryMultiSessionEpisodes returns enriched episodes', () => {
135
+ createEpisode(db, {
136
+ kind: 'decision',
137
+ summary: 'Used FTS5 for search',
138
+ project: 'test-project',
139
+ source: 'diary',
140
+ });
141
+ createEpisode(db, {
142
+ kind: 'learning',
143
+ summary: 'CO-EVOLUTION pattern is critical',
144
+ project: 'test-project',
145
+ source: 'diary',
146
+ });
147
+ createEpisode(db, {
148
+ kind: 'session',
149
+ summary: 'Bare session',
150
+ project: 'test-project',
151
+ source: 'hook',
152
+ });
153
+ const results = queryMultiSessionEpisodes(db, { project: 'test-project', days: 3, limit: 20 });
154
+ expect(results).toHaveLength(2);
155
+ expect(results.every((r) => r.kind !== 'session')).toBe(true);
156
+ });
157
+ test('excludes nomination kind from multi-session query', () => {
158
+ createEpisode(db, {
159
+ kind: 'nomination',
160
+ summary: 'A nomination',
161
+ project: 'test-project',
162
+ source: 'reflect',
163
+ });
164
+ createEpisode(db, {
165
+ kind: 'learning',
166
+ summary: 'A learning',
167
+ project: 'test-project',
168
+ source: 'diary',
169
+ });
170
+ const results = queryMultiSessionEpisodes(db, { project: 'test-project', days: 3, limit: 20 });
171
+ expect(results).toHaveLength(1);
172
+ expect(results[0].kind).toBe('learning');
173
+ });
174
+ test('formatMultiSessionEpisodes groups by date and kind', () => {
175
+ const episodes = [
176
+ { kind: 'decision', summary: 'Test decision', created_at: '2026-04-14T10:00:00Z' },
177
+ { kind: 'learning', summary: 'Test learning', created_at: '2026-04-14T11:00:00Z' },
178
+ { kind: 'friction', summary: 'Test friction', created_at: '2026-04-13T10:00:00Z' },
179
+ ];
180
+ const formatted = formatMultiSessionEpisodes(episodes);
181
+ expect(formatted).toContain('[2026-04-14]');
182
+ expect(formatted).toContain('decision:');
183
+ expect(formatted).toContain('learning:');
184
+ expect(formatted).toContain('[2026-04-13]');
185
+ expect(formatted).toContain('friction:');
186
+ });
187
+ test('respects token cap by grouping when too many', () => {
188
+ const episodes = [];
189
+ for (let i = 0; i < 30; i++) {
190
+ episodes.push({
191
+ kind: 'learning',
192
+ summary: `Learning item number ${i} with a reasonably long description`,
193
+ created_at: '2026-04-14T10:00:00Z',
194
+ });
195
+ }
196
+ const formatted = formatMultiSessionEpisodes(episodes);
197
+ expect(formatted.length).toBeLessThan(2500);
198
+ });
199
+ test('returns empty string for no episodes', () => {
200
+ expect(formatMultiSessionEpisodes([])).toBe('');
201
+ });
202
+ });
121
203
  //# sourceMappingURL=session-focus.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-focus.test.js","sourceRoot":"","sources":["../../tests/session-focus.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-focus.test.js","sourceRoot":"","sources":["../../tests/session-focus.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=supersedes-chain.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supersedes-chain.test.d.ts","sourceRoot":"","sources":["../../tests/supersedes-chain.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const db_js_1 = require("./helpers/db.js");
4
+ const episodes_js_1 = require("../scripts/lib/episodes.js");
5
+ const { querySupersededChains, formatSupersededChains, } = require('../hooks/lib/mindlore-common.cjs');
6
+ let env;
7
+ let db;
8
+ beforeEach(() => {
9
+ env = (0, db_js_1.createEpisodesTestEnv)('supersedes-chain');
10
+ db = env.db;
11
+ });
12
+ afterEach(() => {
13
+ (0, db_js_1.destroyEpisodesTestEnv)(env);
14
+ });
15
+ describe('supersedes chain query', () => {
16
+ test('returns empty array when no superseded episodes', () => {
17
+ const result = querySupersededChains(db, { project: 'test-project' });
18
+ expect(result).toEqual([]);
19
+ });
20
+ test('returns chain when episode supersedes another', () => {
21
+ const old = (0, episodes_js_1.createEpisode)(db, {
22
+ kind: 'decision',
23
+ summary: 'JSONL kullanacagiz',
24
+ project: 'test-project',
25
+ source: 'decide',
26
+ });
27
+ (0, episodes_js_1.supersede)(db, old.id, {
28
+ kind: 'decision',
29
+ summary: 'SQLite\'a gectik',
30
+ body: '## Reason\nQuery gucu daha yuksek',
31
+ project: 'test-project',
32
+ source: 'decide',
33
+ });
34
+ const chains = querySupersededChains(db, { project: 'test-project' });
35
+ expect(chains).toHaveLength(1);
36
+ expect(chains[0]?.current).toBe('SQLite\'a gectik');
37
+ expect(chains[0]?.previous).toBe('JSONL kullanacagiz');
38
+ expect(chains[0]?.reason).toBe('Query gucu daha yuksek');
39
+ });
40
+ test('respects limit parameter', () => {
41
+ for (let i = 0; i < 3; i++) {
42
+ const old = (0, episodes_js_1.createEpisode)(db, {
43
+ kind: 'decision',
44
+ summary: `Old decision ${i}`,
45
+ project: 'test-project',
46
+ source: 'decide',
47
+ });
48
+ (0, episodes_js_1.supersede)(db, old.id, {
49
+ kind: 'decision',
50
+ summary: `New decision ${i}`,
51
+ project: 'test-project',
52
+ source: 'decide',
53
+ });
54
+ }
55
+ const chains = querySupersededChains(db, { project: 'test-project', limit: 2 });
56
+ expect(chains).toHaveLength(2);
57
+ });
58
+ test('filters by project', () => {
59
+ const old = (0, episodes_js_1.createEpisode)(db, {
60
+ kind: 'decision',
61
+ summary: 'Other project decision',
62
+ project: 'other-project',
63
+ source: 'decide',
64
+ });
65
+ (0, episodes_js_1.supersede)(db, old.id, {
66
+ kind: 'decision',
67
+ summary: 'Other project new',
68
+ project: 'other-project',
69
+ source: 'decide',
70
+ });
71
+ const chains = querySupersededChains(db, { project: 'test-project' });
72
+ expect(chains).toHaveLength(0);
73
+ });
74
+ test('parses reason from body ## Reason section', () => {
75
+ const old = (0, episodes_js_1.createEpisode)(db, {
76
+ kind: 'decision',
77
+ summary: 'Old way',
78
+ project: 'test-project',
79
+ source: 'decide',
80
+ });
81
+ (0, episodes_js_1.supersede)(db, old.id, {
82
+ kind: 'decision',
83
+ summary: 'New way',
84
+ body: '## Context\nSome context\n\n## Reason\nPerformance 3x better\n\n## Notes\nExtra info',
85
+ project: 'test-project',
86
+ source: 'decide',
87
+ });
88
+ const chains = querySupersededChains(db, { project: 'test-project' });
89
+ expect(chains[0]?.reason).toBe('Performance 3x better');
90
+ });
91
+ });
92
+ describe('supersedes chain format', () => {
93
+ test('formats chain as "current <- previous (Reason: ...)"', () => {
94
+ const chains = [
95
+ { current: 'SQLite\'a gectik', previous: 'JSONL kullanacagiz', reason: 'Query gucu' },
96
+ { current: 'FTS5 11-col', previous: '7-col', reason: null },
97
+ ];
98
+ const formatted = formatSupersededChains(chains);
99
+ expect(formatted).toContain('SQLite\'a gectik');
100
+ expect(formatted).toContain('JSONL kullanacagiz');
101
+ expect(formatted).toContain('Reason: Query gucu');
102
+ expect(formatted).toContain('FTS5 11-col');
103
+ expect(formatted).toContain('7-col');
104
+ });
105
+ test('returns empty string for no chains', () => {
106
+ expect(formatSupersededChains([])).toBe('');
107
+ });
108
+ });
109
+ //# sourceMappingURL=supersedes-chain.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supersedes-chain.test.js","sourceRoot":"","sources":["../../tests/supersedes-chain.test.ts"],"names":[],"mappings":"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"}
@@ -87,12 +87,13 @@ function parseFrontmatter(content) {
87
87
  const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
88
88
  if (!match) return { meta: {}, body: content };
89
89
 
90
- const meta = {};
90
+ const meta = Object.create(null);
91
91
  const lines = match[1].split('\n');
92
92
  for (const line of lines) {
93
93
  const colonIdx = line.indexOf(':');
94
94
  if (colonIdx === -1) continue;
95
95
  const key = line.slice(0, colonIdx).trim();
96
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue;
96
97
  let value = line.slice(colonIdx + 1).trim();
97
98
  if (value.startsWith('[') && value.endsWith(']')) {
98
99
  value = value.slice(1, -1).split(',').map((s) => s.trim().replace(/^["']|["']$/g, ''));
@@ -306,6 +307,19 @@ CREATE TABLE IF NOT EXISTS episodes (
306
307
  created_at TEXT NOT NULL
307
308
  )`;
308
309
 
310
+ /**
311
+ * Valid episode kinds. CO-EVOLUTION: mirrors EPISODE_KINDS in scripts/lib/episodes.ts
312
+ */
313
+ // ~500 tokens context budget for multi-session inject
314
+ const MULTI_SESSION_TOKEN_CAP_CHARS = 2500;
315
+
316
+ const EPISODE_KINDS_CJS = ['session', 'decision', 'event', 'preference', 'learning', 'friction', 'discovery', 'nomination'];
317
+
318
+ /**
319
+ * Valid episode statuses. CO-EVOLUTION: mirrors EPISODE_STATUSES in scripts/lib/episodes.ts
320
+ */
321
+ const EPISODE_STATUSES_CJS = ['active', 'superseded', 'deleted', 'staged', 'reviewed', 'approved', 'rejected'];
322
+
309
323
  const SQL_EPISODES_INDEXES = [
310
324
  'CREATE INDEX IF NOT EXISTS idx_episodes_kind ON episodes(kind, status)',
311
325
  'CREATE INDEX IF NOT EXISTS idx_episodes_project ON episodes(project, status)',
@@ -398,6 +412,126 @@ function queryRecentEpisodes(db, opts) {
398
412
  return db.prepare(sql).all(...params);
399
413
  }
400
414
 
415
+ /**
416
+ * Query superseded episode chains for session-focus display.
417
+ * CO-EVOLUTION: Uses episodes table schema from SQL_EPISODES_CREATE
418
+ * @param {import('better-sqlite3').Database} db
419
+ * @param {{ project: string, days?: number, limit?: number }} opts
420
+ * @returns {Array<{current: string, previous: string, reason: string|null}>}
421
+ */
422
+ function querySupersededChains(db, opts) {
423
+ const days = opts.days ?? 7;
424
+ const limit = opts.limit ?? 5;
425
+ const modifier = `-${days} days`;
426
+ const rows = db.prepare(`
427
+ SELECT new_ep.summary AS current_summary, old_ep.summary AS previous_summary, new_ep.body
428
+ FROM episodes new_ep
429
+ JOIN episodes old_ep ON new_ep.supersedes = old_ep.id
430
+ WHERE new_ep.project = ?
431
+ AND new_ep.created_at > datetime('now', ?)
432
+ AND old_ep.status = 'superseded'
433
+ ORDER BY new_ep.created_at DESC
434
+ LIMIT ?
435
+ `).all(opts.project, modifier, limit);
436
+
437
+ return rows.map(row => ({
438
+ current: row.current_summary,
439
+ previous: row.previous_summary,
440
+ reason: parseReason(row.body),
441
+ }));
442
+ }
443
+
444
+ /**
445
+ * Parse ## Reason section from episode body.
446
+ * @param {string|null} body
447
+ * @returns {string|null}
448
+ */
449
+ function parseReason(body) {
450
+ if (!body) return null;
451
+ const match = body.match(/## Reason\n(.+?)(?:\n##|\n*$)/s);
452
+ if (!match) return null;
453
+ return match[1].trim().split('\n')[0];
454
+ }
455
+
456
+ /**
457
+ * Format superseded chains for session-focus inject.
458
+ * @param {Array<{current: string, previous: string, reason: string|null}>} chains
459
+ * @returns {string}
460
+ */
461
+ function formatSupersededChains(chains) {
462
+ if (chains.length === 0) return '';
463
+ const lines = chains.map(c => {
464
+ const base = `- ${c.current} \u2190 ${c.previous}`;
465
+ return c.reason ? `${base} (Reason: ${c.reason})` : base;
466
+ });
467
+ return lines.join('\n');
468
+ }
469
+
470
+ /**
471
+ * Query episodes across multiple sessions for enriched inject.
472
+ * Excludes bare session episodes and nominations.
473
+ * CO-EVOLUTION: Uses episodes table schema from SQL_EPISODES_CREATE
474
+ * @param {import('better-sqlite3').Database} db
475
+ * @param {{ project: string, days?: number, limit?: number }} opts
476
+ */
477
+ function queryMultiSessionEpisodes(db, opts) {
478
+ const days = opts.days ?? 3;
479
+ const limit = opts.limit ?? 20;
480
+ const modifier = `-${days} days`;
481
+ return db.prepare(`
482
+ SELECT kind, summary, created_at
483
+ FROM episodes
484
+ WHERE project = ?
485
+ AND status = 'active'
486
+ AND kind != 'session'
487
+ AND kind != 'nomination'
488
+ AND created_at > datetime('now', ?)
489
+ ORDER BY created_at DESC
490
+ LIMIT ?
491
+ `).all(opts.project, modifier, limit);
492
+ }
493
+
494
+ /**
495
+ * Format multi-session episodes for inject.
496
+ * Groups by date. If too many per date, collapses to count-per-kind.
497
+ * @param {Array<{kind: string, summary: string, created_at: string}>} episodes
498
+ * @returns {string}
499
+ */
500
+ function formatMultiSessionEpisodes(episodes) {
501
+ if (episodes.length === 0) return '';
502
+
503
+ const byDate = {};
504
+ for (const ep of episodes) {
505
+ const date = (ep.created_at || '').slice(0, 10);
506
+ if (!byDate[date]) byDate[date] = [];
507
+ byDate[date].push(ep);
508
+ }
509
+
510
+ const lines = [];
511
+ let totalChars = 0;
512
+
513
+ for (const [date, eps] of Object.entries(byDate).sort((a, b) => b[0].localeCompare(a[0]))) {
514
+ if (totalChars > MULTI_SESSION_TOKEN_CAP_CHARS) break;
515
+ if (eps.length <= 5) {
516
+ for (const ep of eps) {
517
+ const line = `- [${date}] ${ep.kind}: ${String(ep.summary).slice(0, 100)}`;
518
+ totalChars += line.length;
519
+ if (totalChars > MULTI_SESSION_TOKEN_CAP_CHARS) break;
520
+ lines.push(line);
521
+ }
522
+ } else {
523
+ const kindCounts = {};
524
+ for (const ep of eps) {
525
+ kindCounts[ep.kind] = (kindCounts[ep.kind] || 0) + 1;
526
+ }
527
+ const counts = Object.entries(kindCounts).map(([k, c]) => `${c} ${k}`).join(', ');
528
+ lines.push(`- [${date}] ${counts}`);
529
+ }
530
+ }
531
+
532
+ return lines.join('\n');
533
+ }
534
+
401
535
  module.exports = {
402
536
  MINDLORE_DIR,
403
537
  GLOBAL_MINDLORE_DIR,
@@ -423,7 +557,9 @@ module.exports = {
423
557
  detectSchemaVersion,
424
558
  getProjectName,
425
559
  DEFAULT_MODELS,
426
- // Episodes (v0.4.0)
560
+ // Episodes (v0.4.1)
561
+ EPISODE_KINDS_CJS,
562
+ EPISODE_STATUSES_CJS,
427
563
  SQL_EPISODES_CREATE,
428
564
  SQL_EPISODES_INDEXES,
429
565
  ensureEpisodesTable,
@@ -431,4 +567,8 @@ module.exports = {
431
567
  generateEpisodeId,
432
568
  insertBareEpisode,
433
569
  queryRecentEpisodes,
570
+ querySupersededChains,
571
+ formatSupersededChains,
572
+ queryMultiSessionEpisodes,
573
+ formatMultiSessionEpisodes,
434
574
  };
@@ -16,8 +16,10 @@ function main() {
16
16
  const filePath = readHookStdin(['path', 'file_path']);
17
17
  if (!filePath) return;
18
18
 
19
- // Only process .md files inside .mindlore/
20
- if (!filePath.includes(MINDLORE_DIR) || !filePath.endsWith('.md')) return;
19
+ // Only process .md files inside .mindlore/ (resolved path check prevents traversal)
20
+ if (!filePath.endsWith('.md')) return;
21
+ const resolvedFile = path.resolve(filePath);
22
+ if (!resolvedFile.includes(path.sep + MINDLORE_DIR + path.sep) && !resolvedFile.includes(path.sep + MINDLORE_DIR)) return;
21
23
 
22
24
  const fileName = path.basename(filePath);
23
25
  if (SKIP_FILES.has(fileName)) return;
@@ -60,18 +62,19 @@ function main() {
60
62
  const { meta, body } = parseFrontmatter(content);
61
63
  const { slug, description, type, category, title, tags, quality, dateCaptured } = extractFtsMetadata(meta, body, filePath, baseDir);
62
64
 
63
- // Update FTS5
64
- db.prepare('DELETE FROM mindlore_fts WHERE path = ?').run(filePath);
65
- insertFtsRow(db, { path: filePath, slug, description, type, category, title, content: body, tags, quality, dateCaptured, project: getProjectName() });
66
-
67
- // Update hash
68
- db.prepare(
69
- `INSERT INTO file_hashes (path, content_hash, last_indexed)
70
- VALUES (?, ?, ?)
71
- ON CONFLICT(path) DO UPDATE SET
72
- content_hash = excluded.content_hash,
73
- last_indexed = excluded.last_indexed`
74
- ).run(filePath, hash, new Date().toISOString());
65
+ // Update FTS5 + hash atomically
66
+ const updateIndex = db.transaction(() => {
67
+ db.prepare('DELETE FROM mindlore_fts WHERE path = ?').run(filePath);
68
+ insertFtsRow(db, { path: filePath, slug, description, type, category, title, content: body, tags, quality, dateCaptured, project: getProjectName() });
69
+ db.prepare(
70
+ `INSERT INTO file_hashes (path, content_hash, last_indexed)
71
+ VALUES (?, ?, ?)
72
+ ON CONFLICT(path) DO UPDATE SET
73
+ content_hash = excluded.content_hash,
74
+ last_indexed = excluded.last_indexed`
75
+ ).run(filePath, hash, new Date().toISOString());
76
+ });
77
+ updateIndex();
75
78
  } finally {
76
79
  db.close();
77
80
  }
@@ -21,8 +21,8 @@ function main() {
21
21
  const indexScript = path.join(__dirname, '..', 'scripts', 'mindlore-fts5-index.cjs');
22
22
  if (fs.existsSync(indexScript)) {
23
23
  try {
24
- const { execSync } = require('child_process');
25
- execSync(`node "${indexScript}" "${baseDir}"`, {
24
+ const { spawnSync } = require('child_process');
25
+ spawnSync('node', [indexScript, baseDir], {
26
26
  timeout: 10000,
27
27
  stdio: 'pipe',
28
28
  });
@@ -80,7 +80,9 @@ function searchDb(dbPath, keywords, Database) {
80
80
 
81
81
  for (const kw of keywords) {
82
82
  try {
83
- const r = matchStmt.get(row.path, '"' + kw + '"');
83
+ const sanitized = kw.replace(/["*(){}[\]^~:]/g, '');
84
+ if (!sanitized) continue;
85
+ const r = matchStmt.get(row.path, '"' + sanitized + '"');
84
86
  if (r) {
85
87
  hits++;
86
88
  totalRank += r.rank;
@@ -110,7 +112,7 @@ function searchDb(dbPath, keywords, Database) {
110
112
  */
111
113
  function searchEpisodesFts(db, keywords) {
112
114
  try {
113
- const ftsQuery = keywords.map(kw => '"' + kw + '"').join(' OR ');
115
+ const ftsQuery = keywords.map(kw => '"' + kw.replace(/["*(){}[\]^~:]/g, '') + '"').filter(q => q !== '""').join(' OR ');
114
116
  const rows = db.prepare(
115
117
  "SELECT title, category, slug, tags FROM mindlore_fts WHERE type = 'episode' AND mindlore_fts MATCH ? LIMIT 2"
116
118
  ).all(ftsQuery);
@@ -10,13 +10,14 @@
10
10
 
11
11
  const fs = require('fs');
12
12
  const path = require('path');
13
- const { findMindloreDir, readConfig, openDatabase, hasEpisodesTable, queryRecentEpisodes } = require('./lib/mindlore-common.cjs');
13
+ const { findMindloreDir, readConfig, openDatabase, hasEpisodesTable, queryRecentEpisodes, querySupersededChains, formatSupersededChains, queryMultiSessionEpisodes, formatMultiSessionEpisodes, getAllMdFiles } = require('./lib/mindlore-common.cjs');
14
14
 
15
15
  function main() {
16
16
  const baseDir = findMindloreDir();
17
17
  if (!baseDir) return; // No .mindlore/ found, silently skip
18
18
 
19
19
  const output = [];
20
+ const config = readConfig(baseDir);
20
21
 
21
22
  // Inject INDEX.md
22
23
  const indexPath = path.join(baseDir, 'INDEX.md');
@@ -41,7 +42,6 @@ function main() {
41
42
  }
42
43
 
43
44
  // Reflect trigger
44
- const config = readConfig(baseDir);
45
45
  const threshold = config?.reflect?.threshold ?? 5;
46
46
  if (diaryFiles.length >= threshold) {
47
47
  output.push(`[Mindlore] ${diaryFiles.length} diary entry birikti — \`/mindlore-log reflect\` calistirmayi dusun.`);
@@ -70,7 +70,6 @@ function main() {
70
70
  if (db) {
71
71
  try {
72
72
  if (hasEpisodesTable(db)) {
73
- const config = readConfig(baseDir);
74
73
  const maxEpisodes = config?.session_focus?.max_episodes ?? 3;
75
74
  const project = path.basename(process.cwd());
76
75
  const episodes = queryRecentEpisodes(db, { project, limit: maxEpisodes });
@@ -83,6 +82,22 @@ function main() {
83
82
  });
84
83
  output.push(`[Mindlore Episodes]\n${lines.join('\n')}`);
85
84
  }
85
+
86
+ // v0.4.1: Enriched multi-session episodes
87
+ const multiDays = config?.session_focus?.multi_session_days ?? 3;
88
+ const enriched = queryMultiSessionEpisodes(db, { project, days: multiDays, limit: 20 });
89
+ if (enriched.length > 0) {
90
+ const formatted = formatMultiSessionEpisodes(enriched);
91
+ if (formatted) {
92
+ output.push(`[Mindlore Recent Activity]\n${formatted}`);
93
+ }
94
+ }
95
+
96
+ // v0.4.1: Supersedes chain display
97
+ const chains = querySupersededChains(db, { project, days: 7, limit: 5 });
98
+ if (chains.length > 0) {
99
+ output.push(`[Mindlore Supersedes]\n${formatSupersededChains(chains)}`);
100
+ }
86
101
  }
87
102
  } finally {
88
103
  db.close();
@@ -90,6 +105,18 @@ function main() {
90
105
  }
91
106
  } catch (_err) { /* graceful skip */ }
92
107
 
108
+ // v0.4.1: Lightweight stale content check (monitors fallback)
109
+ try {
110
+ const allFiles = getAllMdFiles(baseDir);
111
+ const thirtyDaysAgo = Date.now() - (30 * 24 * 60 * 60 * 1000);
112
+ const staleCount = allFiles.reduce((count, f) => {
113
+ try { return fs.statSync(f).mtimeMs < thirtyDaysAgo ? count + 1 : count; } catch { return count; }
114
+ }, 0);
115
+ if (staleCount > 3) {
116
+ output.push(`[Mindlore: ${staleCount} dosya 30+ gundur guncellenmemis — \`/mindlore-evolve\` dusun]`);
117
+ }
118
+ } catch (_healthErr) { /* skip */ }
119
+
93
120
  if (output.length > 0) {
94
121
  process.stdout.write(output.join('\n\n') + '\n');
95
122
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mindlore",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "AI-native knowledge system for Claude Code",
5
5
  "type": "commonjs",
6
6
  "bin": {
package/plugin.json CHANGED
@@ -1,42 +1,42 @@
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.3.0",
4
+ "version": "0.4.1",
5
5
  "skills": [
6
6
  {
7
7
  "name": "mindlore-ingest",
8
8
  "path": "skills/mindlore-ingest/SKILL.md",
9
- "description": "Add new knowledge sources (URL, text, file, PDF, GitHub repo)"
9
+ "description": "Add new knowledge sources to .mindlore/ knowledge base. Supports: URL (web page to markdown), text (inline paste), file (local .md/.txt/.pdf), PDF (markitdown extraction), GitHub repo (README + structure analysis). Includes 6-point quality gate: frontmatter validation, slug uniqueness, content length, source_type tagging, quality heuristic assignment, and FTS5 indexing. Auto-generates frontmatter with type, slug, date, tags, and quality fields."
10
10
  },
11
11
  {
12
12
  "name": "mindlore-health",
13
13
  "path": "skills/mindlore-health/SKILL.md",
14
- "description": "Run 16-point structural health check on .mindlore/ knowledge base"
14
+ "description": "Run 16-point structural health check on .mindlore/ knowledge base. 12 deterministic script checks: INDEX.md sync, FTS5 row count, frontmatter validation, orphan file detection, slug uniqueness, directory structure, log.md integrity, config.json schema, episodes table health, content-hash dedup status, cross-reference consistency, file naming conventions. 4 LLM-powered checks: domain coverage gaps, stale content detection, tag taxonomy coherence, knowledge graph connectivity."
15
15
  },
16
16
  {
17
17
  "name": "mindlore-query",
18
18
  "path": "skills/mindlore-query/SKILL.md",
19
- "description": "Search, ask, stats, brief — compounding knowledge pipeline"
19
+ "description": "Search, ask, stats, brief — compounding knowledge pipeline. Modes: search (FTS5 full-text + episodes recall), ask (LLM-powered Q&A grounded in knowledge base), stats (episode counts, domain coverage, freshness metrics), brief (executive summary of recent activity). Combines FTS5 text search with episodic memory for richer recall. Supports project-scoped and global queries."
20
20
  },
21
21
  {
22
22
  "name": "mindlore-log",
23
23
  "path": "skills/mindlore-log/SKILL.md",
24
- "description": "Session logging, pattern extraction, wiki updates"
24
+ "description": "Session logging, pattern extraction, and wiki updates. Modes: diary (LLM session analysis to enriched episodes: decisions, discoveries, frictions, learnings, preferences, events), reflect (scan episodes for recurring patterns, 3-tier confidence assessment, nomination pipeline for rule proposals), status (recent sessions summary with trends), save (structured delta + log.md append + domain wiki update). Episodes-powered since v0.4.0."
25
25
  },
26
26
  {
27
27
  "name": "mindlore-decide",
28
28
  "path": "skills/mindlore-decide/SKILL.md",
29
- "description": "Record and list decisions with context, alternatives, rationale"
29
+ "description": "Record and list architectural, tool, format, and strategy decisions with full context. Captures: alternatives considered, rationale, trade-offs, and outcome. Supports supersedes chain — when a decision replaces an older one, links them with reason. Episodes integration: decisions stored as kind:decision episodes with structured body. List mode shows active decisions with supersedes history."
30
30
  },
31
31
  {
32
32
  "name": "mindlore-evolve",
33
33
  "path": "skills/mindlore-evolve/SKILL.md",
34
- "description": "Knowledge schema co-evolution — scan domains+sources, suggest updates"
34
+ "description": "Knowledge schema co-evolution — scan domains and sources for inconsistencies, suggest structural updates. Detects: orphaned references, outdated cross-links, missing domain coverage, INDEX.md drift, stale source summaries. Proposes: new domain pages, source updates, INDEX.md reorganization, CLAUDE.md convention changes. Default scope: project + global (--scope project|global|all)."
35
35
  },
36
36
  {
37
37
  "name": "mindlore-explore",
38
38
  "path": "skills/mindlore-explore/SKILL.md",
39
- "description": "Discover unexpected connections between knowledge sources"
39
+ "description": "Discover unexpected connections between knowledge sources — undirected exploration mode. Cross-references domains, sources, analyses, and episodes to find non-obvious relationships. Identifies: shared entities across sources, pattern convergence between domains, episodic evidence supporting or contradicting domain claims. Default scope: project + global (--scope project|global|all)."
40
40
  }
41
41
  ],
42
42
  "hooks": [
@@ -11,10 +11,14 @@ Knowledge schema co-evolution. Karpathy's 4th operation (ingest/query/health/**e
11
11
 
12
12
  ## Scope
13
13
 
14
- Determine target using `getActiveMindloreDir()` logic:
15
- - Default (no flag): scan project `.mindlore/`
16
- - `--global`: scan `~/.mindlore/`
17
- - Never hardcode `.mindlore/` path always resolve dynamically
14
+ Default: `--scope all` (project + global birlikte taranır).
15
+ Options: `--scope project` | `--scope global` | `--scope all`
16
+
17
+ 1. Determine scope from argument (default: all)
18
+ 2. If `all`: scan both project `.mindlore/` and global `~/.mindlore/`
19
+ 3. If `project`: scan only project-scoped content (current CWD's `.mindlore/`)
20
+ 4. If `global`: scan only global `~/.mindlore/` content
21
+ - Never hardcode `.mindlore/` path — always resolve dynamically via `getActiveMindloreDir()`
18
22
 
19
23
  ## Trigger
20
24
 
@@ -11,10 +11,14 @@ Discover unexpected connections between knowledge sources. Undirected exploratio
11
11
 
12
12
  ## Scope
13
13
 
14
- Determine target using `getActiveMindloreDir()` logic:
15
- - Default (no flag): explore project `.mindlore/`
16
- - `--global`: explore `~/.mindlore/` + project cross-reference (most valuable mode)
17
- - Never hardcode `.mindlore/` path always resolve dynamically
14
+ Default: `--scope all` (project + global birlikte taranır — en değerli mod).
15
+ Options: `--scope project` | `--scope global` | `--scope all`
16
+
17
+ 1. Determine scope from argument (default: all)
18
+ 2. If `all`: explore both project `.mindlore/` and global `~/.mindlore/` + cross-reference
19
+ 3. If `project`: explore only project-scoped content (current CWD's `.mindlore/`)
20
+ 4. If `global`: explore only global `~/.mindlore/` content
21
+ - Never hardcode `.mindlore/` path — always resolve dynamically via `getActiveMindloreDir()`
18
22
 
19
23
  ## Trigger
20
24
 
@@ -86,7 +86,16 @@ LLM-driven pattern extraction from episodes → persistent learnings.
86
86
  - Recurring frictions (same blocker/error)
87
87
  - Discovery patterns (assumptions that keep breaking)
88
88
  - Workflow patterns that worked well
89
- 5. **Structured report output:**
89
+ 5. **3-Tier Confidence Assessment:**
90
+ For each detected pattern, count occurrences across episodes:
91
+
92
+ | Tekrar | Tier | Aksiyon |
93
+ |--------|------|---------|
94
+ | 1x | Note | Sessiz — episode olarak kalır, raporda göster |
95
+ | 2x | Learning | `kind: learning` episode oluştur, learnings/ dosyasına yaz |
96
+ | 3x+ | Nomination | `kind: nomination, status: staged, source: reflect` episode oluştur |
97
+
98
+ 6. **Structured report output:**
90
99
 
91
100
  ```
92
101
  ── Reflect Raporu (son {days} gün, {N} episode) ──
@@ -101,25 +110,73 @@ Decisions ({count}):
101
110
  - {summary}
102
111
 
103
112
  Patterns:
104
- - "{pattern_description}" → kural adayı
113
+ - "CO-EVOLUTION sync hatası" → 3x tekrar → NOMINATION (staged)
114
+ - "ESM import sorunu" → 2x tekrar → LEARNING
115
+ - "Test mock karmaşıklığı" → 1x → NOTE
105
116
 
106
117
  Önerilen:
107
118
  [ ] {rule} ({repeat_count}x, {confidence} confidence)
108
119
  ```
109
120
 
110
- 6. User approves write to `learnings/{topic}.md`
111
- 7. Format: `YAPMA:` / `BEST PRACTICE:` / `KRITIK:` prefixed rules
112
- 8. Update relevant domain page if pattern relates to an existing domain
113
- 9. Mark processed episodes: future reflect skips already-processed timeranges
114
- 10. Append to `log.md`: `| {date} | reflect | {N} episodes processed, {M} learnings written |`
121
+ 7. **Nomination oluşturma (3x+ tekrar):**
122
+ - `kind: nomination`, `status: staged`, `source: reflect`
123
+ - Body formatı:
124
+ ```markdown
125
+ ## Target: learnings
126
+ ## Rule
127
+ YAPMA: Schema değişikliğinde tek dosyayı güncelleme — CO-EVOLUTION sync zorunlu
128
+ ## Evidence
129
+ - ep-xxx: episodes.ts güncellendi ama common.cjs unutuldu (2026-04-10)
130
+ - ep-yyy: Aynı hata tekrar (2026-04-12)
131
+ - ep-zzz: Test'te yakalandı (2026-04-13)
132
+ ## Confidence
133
+ 3x tekrar, 3 gün içinde
134
+ ```
135
+ - Target options: `learnings` | `claude.md` | `domain:{slug}`
136
+
137
+ 8. **Pending nominations check:**
138
+ Reflect başlarken staged nomination'ları kontrol et:
139
+ ```sql
140
+ SELECT id, summary, body, created_at FROM episodes
141
+ WHERE kind = 'nomination' AND status = 'staged' AND project = ?
142
+ ORDER BY created_at ASC
143
+ ```
144
+ Varsa kullanıcıya sun:
145
+ ```
146
+ ── Bekleyen Nomination'lar ({N} adet) ──
147
+ 1. "CO-EVOLUTION sync zorunlu" (staged 2 gün önce)
148
+ Target: learnings | Confidence: 3x
149
+ 2. "Test before commit" (staged 5 gün önce)
150
+ Target: claude.md | Confidence: 4x
151
+
152
+ Onaylamak istediğin numara(lar)ı seç, veya 'skip' de:
153
+ ```
154
+
155
+ 9. **Nomination approval flow:**
156
+ Kullanıcı onaylarsa:
157
+ - `status: staged → approved`
158
+ - Target'a göre yaz:
159
+ - `learnings` → ilgili `learnings/{topic}.md` dosyasına YAPMA/BEST PRACTICE ekle
160
+ - `claude.md` → ilgili projenin CLAUDE.md'sine kural ekle (kullanıcıya göster, onay al)
161
+ - `domain:{slug}` → ilgili domain sayfasına ekle
162
+ Kullanıcı reddederse:
163
+ - `status: staged → rejected`
164
+ - Body'ye `## Rejection Reason\n{kullanıcı açıklaması}` ekle
165
+
166
+ 10. User approves new learnings → write to `learnings/{topic}.md`
167
+ 11. Format: `YAPMA:` / `BEST PRACTICE:` / `KRITIK:` prefixed rules
168
+ 12. Update relevant domain page if pattern relates to an existing domain
169
+ 13. Mark processed episodes: future reflect skips already-processed timeranges
170
+ 14. Append to `log.md`: `| {date} | reflect | {N} episodes processed, {M} learnings written |`
115
171
 
116
172
  **Fallback:** Also reads non-archived delta files if episodes table is empty (backward compat with v0.3 deltas).
117
173
 
118
174
  **Rules:**
119
- - NEVER write learnings without user approval
175
+ - NEVER write learnings or nominations without user approval
120
176
  - Group related patterns into existing topic files (don't create one file per pattern)
121
177
  - Reflect scans both project + global diary/ in `--all` mode
122
178
  - Deduplication: same pattern found in both episodes and deltas → episodes win
179
+ - Nominations with `status: staged` are hidden from default queries — only reflect sees them
123
180
 
124
181
  ### status
125
182
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.4.0",
2
+ "version": "0.4.1",
3
3
  "models": {
4
4
  "ingest": "haiku",
5
5
  "evolve": "sonnet",
@@ -10,6 +10,7 @@
10
10
  "threshold": 5
11
11
  },
12
12
  "session_focus": {
13
- "max_episodes": 3
13
+ "max_episodes": 3,
14
+ "multi_session_days": 3
14
15
  }
15
16
  }