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 +1 -1
- package/dist/scripts/lib/episodes.d.ts +3 -3
- package/dist/scripts/lib/episodes.d.ts.map +1 -1
- package/dist/scripts/lib/episodes.js +3 -3
- package/dist/scripts/lib/episodes.js.map +1 -1
- package/dist/tests/diary.test.js +3 -3
- package/dist/tests/diary.test.js.map +1 -1
- package/dist/tests/nomination.test.d.ts +2 -0
- package/dist/tests/nomination.test.d.ts.map +1 -0
- package/dist/tests/nomination.test.js +94 -0
- package/dist/tests/nomination.test.js.map +1 -0
- package/dist/tests/session-focus.test.js +82 -0
- package/dist/tests/session-focus.test.js.map +1 -1
- package/dist/tests/supersedes-chain.test.d.ts +2 -0
- package/dist/tests/supersedes-chain.test.d.ts.map +1 -0
- package/dist/tests/supersedes-chain.test.js +109 -0
- package/dist/tests/supersedes-chain.test.js.map +1 -0
- package/hooks/lib/mindlore-common.cjs +142 -2
- package/hooks/mindlore-index.cjs +17 -14
- package/hooks/mindlore-pre-compact.cjs +2 -2
- package/hooks/mindlore-search.cjs +4 -2
- package/hooks/mindlore-session-focus.cjs +30 -3
- package/package.json +1 -1
- package/plugin.json +8 -8
- package/skills/mindlore-evolve/SKILL.md +8 -4
- package/skills/mindlore-explore/SKILL.md +8 -4
- package/skills/mindlore-log/SKILL.md +65 -8
- package/templates/config.json +3 -2
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.
|
|
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.
|
|
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,
|
|
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.
|
|
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":";AAAA;;;;;;GAMG;;;;;;AAoGH,sCA2CC;AAED,gCAEC;AAED,sCAwCC;AAED,8BAEC;AAED,sCAGC;AAED,sCAOC;AAID,kCAkBC;AAID,kDAUC;AAED,4CAMC;AAzPD,oDAA4B;AAE5B,mDAA+C;AAI/C,wEAAwE;AAE3D,QAAA,aAAa,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"episodes.js","sourceRoot":"","sources":["../../../scripts/lib/episodes.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/diary.test.js
CHANGED
|
@@ -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
|
|
25
|
-
expect(episodes_js_1.EPISODE_KINDS).toHaveLength(
|
|
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":";AAAA;;;GAGG;;AAGH,2CAAgF;AAEhF,4DAIoC;AAGpC,MAAM,EACJ,iBAAiB,EACjB,mBAAmB,GACpB,GAGG,OAAO,CAAC,kCAAkC,CAAC,CAAC;AAEhD,IAAI,GAAoB,CAAC;AACzB,IAAI,EAAqB,CAAC;AAE1B,UAAU,CAAC,GAAG,EAAE;IACd,GAAG,GAAG,IAAA,6BAAqB,EAAC,OAAO,CAAC,CAAC;IACrC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;AACd,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,8BAAsB,EAAC,GAAG,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,2BAAa,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,2BAAa,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,2BAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,GAAG,2BAAa,CAAC,CAAC,CAAC,OAAO,CAAC;YACjC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW;
|
|
1
|
+
{"version":3,"file":"diary.test.js","sourceRoot":"","sources":["../../tests/diary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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.
|
|
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
|
};
|
package/hooks/mindlore-index.cjs
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
)
|
|
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 {
|
|
25
|
-
|
|
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
|
|
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
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.
|
|
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 (
|
|
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
|
|
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
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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. **
|
|
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
|
-
- "
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
|
package/templates/config.json
CHANGED