mindlore 0.6.5 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/scripts/init.js +34 -16
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/all-migrations.d.ts +6 -0
- package/dist/scripts/lib/all-migrations.d.ts.map +1 -0
- package/dist/scripts/lib/all-migrations.js +35 -0
- package/dist/scripts/lib/all-migrations.js.map +1 -0
- package/dist/scripts/lib/migrations-v066.d.ts +4 -0
- package/dist/scripts/lib/migrations-v066.d.ts.map +1 -0
- package/dist/scripts/lib/migrations-v066.js +14 -0
- package/dist/scripts/lib/migrations-v066.js.map +1 -0
- package/dist/scripts/lib/migrations-v067.d.ts +7 -0
- package/dist/scripts/lib/migrations-v067.d.ts.map +1 -0
- package/dist/scripts/lib/migrations-v067.js +50 -0
- package/dist/scripts/lib/migrations-v067.js.map +1 -0
- package/dist/scripts/lib/session-payload.d.ts +9 -1
- package/dist/scripts/lib/session-payload.d.ts.map +1 -1
- package/dist/scripts/lib/session-payload.js +25 -6
- package/dist/scripts/lib/session-payload.js.map +1 -1
- package/dist/scripts/mindlore-fts5-index.js +2 -5
- package/dist/scripts/mindlore-fts5-index.js.map +1 -1
- package/dist/tests/episodes-inject.test.js +71 -0
- package/dist/tests/episodes-inject.test.js.map +1 -1
- package/dist/tests/fts5.test.js +23 -0
- package/dist/tests/fts5.test.js.map +1 -1
- package/dist/tests/helpers/db.d.ts +1 -0
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js +10 -1
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/init.test.js +26 -0
- package/dist/tests/init.test.js.map +1 -1
- package/dist/tests/lesson-graduation.test.d.ts +2 -0
- package/dist/tests/lesson-graduation.test.d.ts.map +1 -0
- package/dist/tests/lesson-graduation.test.js +83 -0
- package/dist/tests/lesson-graduation.test.js.map +1 -0
- package/dist/tests/migrations-v063.test.js +1 -1
- package/dist/tests/migrations-v066.test.d.ts +2 -0
- package/dist/tests/migrations-v066.test.d.ts.map +1 -0
- package/dist/tests/migrations-v066.test.js +54 -0
- package/dist/tests/migrations-v066.test.js.map +1 -0
- package/dist/tests/migrations-v067.test.d.ts +2 -0
- package/dist/tests/migrations-v067.test.d.ts.map +1 -0
- package/dist/tests/migrations-v067.test.js +115 -0
- package/dist/tests/migrations-v067.test.js.map +1 -0
- package/dist/tests/obsidian.test.js +2 -1
- package/dist/tests/obsidian.test.js.map +1 -1
- package/dist/tests/session-end-cleanup.test.d.ts +2 -0
- package/dist/tests/session-end-cleanup.test.d.ts.map +1 -0
- package/dist/tests/session-end-cleanup.test.js +76 -0
- package/dist/tests/session-end-cleanup.test.js.map +1 -0
- package/dist/tests/session-focus-helpers.test.d.ts +2 -0
- package/dist/tests/session-focus-helpers.test.d.ts.map +1 -0
- package/dist/tests/session-focus-helpers.test.js +80 -0
- package/dist/tests/session-focus-helpers.test.js.map +1 -0
- package/dist/tests/session-focus.test.js +111 -10
- package/dist/tests/session-focus.test.js.map +1 -1
- package/dist/tests/session-payload.test.js +10 -10
- package/dist/tests/session-payload.test.js.map +1 -1
- package/dist/tests/session-summary.test.js +1 -1
- package/dist/tests/session-summary.test.js.map +1 -1
- package/dist/tests/stats-skill.test.d.ts +2 -0
- package/dist/tests/stats-skill.test.d.ts.map +1 -0
- package/dist/tests/stats-skill.test.js +55 -0
- package/dist/tests/stats-skill.test.js.map +1 -0
- package/hooks/lib/mindlore-common.cjs +38 -0
- package/hooks/mindlore-search.cjs +2 -1
- package/hooks/mindlore-session-end.cjs +4 -1
- package/hooks/mindlore-session-focus.cjs +93 -36
- package/package.json +1 -1
- package/plugin.json +6 -1
- package/skills/mindlore-ingest/SKILL.md +11 -0
- package/skills/mindlore-reflect/SKILL.md +10 -0
- package/skills/mindlore-stats/SKILL.md +106 -0
- package/templates/config.json +1 -1
- package/templates/extraction/article.md +15 -0
- package/templates/extraction/changelog.md +15 -0
- package/templates/extraction/default.md +15 -0
- package/templates/extraction/docs.md +15 -0
- package/templates/extraction/github-repo.md +17 -0
|
@@ -38,7 +38,7 @@ describe('buildSessionPayload', () => {
|
|
|
38
38
|
insertEpisode('decision', 'Use TypeScript for all scripts');
|
|
39
39
|
insertEpisode('friction', 'CI pipeline is slow');
|
|
40
40
|
insertEpisode('learning', 'Always build before test');
|
|
41
|
-
const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
|
|
41
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
|
|
42
42
|
expect(payload.sections).toHaveLength(4);
|
|
43
43
|
expect(payload.sections[0].label).toBe('Session');
|
|
44
44
|
expect(payload.sections[1].label).toBe('Decisions');
|
|
@@ -52,7 +52,7 @@ describe('buildSessionPayload', () => {
|
|
|
52
52
|
insertEpisode('decision', 'Short decision');
|
|
53
53
|
insertEpisode('friction', 'Short friction');
|
|
54
54
|
insertEpisode('learning', 'Short learning');
|
|
55
|
-
const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, 20);
|
|
55
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT, tokenBudget: 20 });
|
|
56
56
|
expect(payload.sections.length).toBeLessThan(4);
|
|
57
57
|
expect(payload.sections[0].label).toBe('Session');
|
|
58
58
|
expect(payload.totalTokens).toBeLessThanOrEqual(20);
|
|
@@ -62,15 +62,15 @@ describe('buildSessionPayload', () => {
|
|
|
62
62
|
insertEpisode('decision', 'Dec');
|
|
63
63
|
insertEpisode('friction', 'Fric');
|
|
64
64
|
insertEpisode('learning', 'Learn');
|
|
65
|
-
const full = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, 99999);
|
|
65
|
+
const full = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT, tokenBudget: 99999 });
|
|
66
66
|
const sessionTokens = full.sections[0].tokens;
|
|
67
67
|
const decisionTokens = full.sections[1].tokens;
|
|
68
68
|
const budgetFor2 = sessionTokens + decisionTokens + 1;
|
|
69
|
-
const trimmed = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, budgetFor2);
|
|
69
|
+
const trimmed = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT, tokenBudget: budgetFor2 });
|
|
70
70
|
expect(trimmed.sections.map(s => s.label)).toEqual(['Session', 'Decisions']);
|
|
71
71
|
});
|
|
72
72
|
test('handles empty DB gracefully', () => {
|
|
73
|
-
const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
|
|
73
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
|
|
74
74
|
expect(payload.sections).toHaveLength(4);
|
|
75
75
|
expect(payload.sections[0].content).toContain('No previous session data');
|
|
76
76
|
expect(payload.sections[1].content).toContain('No recent decisions');
|
|
@@ -79,7 +79,7 @@ describe('buildSessionPayload', () => {
|
|
|
79
79
|
});
|
|
80
80
|
test('handles missing diary directory', () => {
|
|
81
81
|
insertEpisode('decision', 'A decision');
|
|
82
|
-
const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
|
|
82
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
|
|
83
83
|
expect(payload.sections[0].label).toBe('Session');
|
|
84
84
|
expect(payload.sections[0].content).toContain('No previous session data');
|
|
85
85
|
expect(payload.sections).toHaveLength(4);
|
|
@@ -87,7 +87,7 @@ describe('buildSessionPayload', () => {
|
|
|
87
87
|
test('token estimation is reasonable', () => {
|
|
88
88
|
const text = 'abcd'; // 4 chars = 1 token
|
|
89
89
|
writeDelta('delta-2026-04-19.md', `# H\n- ${text}`);
|
|
90
|
-
const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
|
|
90
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
|
|
91
91
|
for (const section of payload.sections) {
|
|
92
92
|
const expectedTokens = Math.ceil(section.content.length / 4);
|
|
93
93
|
expect(section.tokens).toBe(expectedTokens);
|
|
@@ -98,14 +98,14 @@ describe('buildSessionPayload', () => {
|
|
|
98
98
|
test('reads latest delta file when multiple exist', () => {
|
|
99
99
|
writeDelta('delta-2026-04-18.md', '# Old\n- Old stuff');
|
|
100
100
|
writeDelta('delta-2026-04-19.md', '# Latest\n- Latest stuff');
|
|
101
|
-
const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
|
|
101
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
|
|
102
102
|
expect(payload.sections[0].content).toContain('Latest stuff');
|
|
103
103
|
expect(payload.sections[0].content).not.toContain('Old stuff');
|
|
104
104
|
});
|
|
105
105
|
test('only returns episodes for matching project', () => {
|
|
106
106
|
insertEpisode('decision', 'My project decision', { project: PROJECT });
|
|
107
107
|
insertEpisode('decision', 'Other project decision', { project: 'other-project' });
|
|
108
|
-
const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
|
|
108
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT });
|
|
109
109
|
expect(payload.sections[1].content).toContain('My project decision');
|
|
110
110
|
expect(payload.sections[1].content).not.toContain('Other project decision');
|
|
111
111
|
});
|
|
@@ -114,7 +114,7 @@ describe('buildSessionPayload', () => {
|
|
|
114
114
|
insertEpisode('decision', 'Dec');
|
|
115
115
|
insertEpisode('friction', 'Fric');
|
|
116
116
|
insertEpisode('learning', 'Learn');
|
|
117
|
-
const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, 1);
|
|
117
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)({ db, baseDir, project: PROJECT, tokenBudget: 1 });
|
|
118
118
|
expect(payload.sections).toHaveLength(1);
|
|
119
119
|
expect(payload.sections[0].label).toBe('Session');
|
|
120
120
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-payload.test.js","sourceRoot":"","sources":["../../tests/session-payload.test.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AAExB,2CAAgF;AAEhF,0EAE2C;AAE3C,IAAI,GAAoB,CAAC;AACzB,IAAI,EAAqB,CAAC;AAC1B,IAAI,OAAe,CAAC;AAEpB,MAAM,OAAO,GAAG,cAAc,CAAC;AAE/B,SAAS,aAAa,CACpB,IAAY,EACZ,OAAe,EACf,OAAmE,EAAE;IAErE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC3D,EAAE,CAAC,OAAO,CACR;0CACsC,CACvC,CAAC,GAAG,CACH,EAAE,EACF,IAAI,EACJ,IAAI,CAAC,OAAO,IAAI,OAAO,EACvB,OAAO,EACP,IAAI,CAAC,MAAM,IAAI,QAAQ,EACvB,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAC5C,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB,EAAE,OAAe;IACnD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,UAAU,CAAC,GAAG,EAAE;IACd,GAAG,GAAG,IAAA,6BAAqB,EAAC,iBAAiB,CAAC,CAAC;IAC/C,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;IACZ,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,8BAAsB,EAAC,GAAG,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,UAAU,CAAC,qBAAqB,EAAE,6BAA6B,CAAC,CAAC;QACjE,aAAa,CAAC,UAAU,EAAE,gCAAgC,CAAC,CAAC;QAC5D,aAAa,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;QACjD,aAAa,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"session-payload.test.js","sourceRoot":"","sources":["../../tests/session-payload.test.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AAExB,2CAAgF;AAEhF,0EAE2C;AAE3C,IAAI,GAAoB,CAAC;AACzB,IAAI,EAAqB,CAAC;AAC1B,IAAI,OAAe,CAAC;AAEpB,MAAM,OAAO,GAAG,cAAc,CAAC;AAE/B,SAAS,aAAa,CACpB,IAAY,EACZ,OAAe,EACf,OAAmE,EAAE;IAErE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC3D,EAAE,CAAC,OAAO,CACR;0CACsC,CACvC,CAAC,GAAG,CACH,EAAE,EACF,IAAI,EACJ,IAAI,CAAC,OAAO,IAAI,OAAO,EACvB,OAAO,EACP,IAAI,CAAC,MAAM,IAAI,QAAQ,EACvB,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAC5C,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB,EAAE,OAAe;IACnD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,UAAU,CAAC,GAAG,EAAE;IACd,GAAG,GAAG,IAAA,6BAAqB,EAAC,iBAAiB,CAAC,CAAC;IAC/C,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;IACZ,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,8BAAsB,EAAC,GAAG,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,UAAU,CAAC,qBAAqB,EAAE,6BAA6B,CAAC,CAAC;QACjE,aAAa,CAAC,UAAU,EAAE,gCAAgC,CAAC,CAAC;QAC5D,aAAa,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;QACjD,aAAa,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,UAAU,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;QACxD,aAAa,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC5C,aAAa,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC5C,aAAa,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAE5C,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAExF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC9E,UAAU,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;QACvD,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACjC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAClC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEnC,MAAM,IAAI,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;QAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;QAEhD,MAAM,UAAU,GAAG,aAAa,GAAG,cAAc,GAAG,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;QAEhG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,oBAAoB;QACzC,UAAU,CAAC,qBAAqB,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,UAAU,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;QACxD,UAAU,CAAC,qBAAqB,EAAE,0BAA0B,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACtD,aAAa,CAAC,UAAU,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,aAAa,CAAC,UAAU,EAAE,wBAAwB,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QAElF,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,UAAU,CAAC,qBAAqB,EAAE,gCAAgC,CAAC,CAAC;QACpE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACjC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAClC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEnC,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAEvF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -118,7 +118,7 @@ describe('session summary → DB → payload integration', () => {
|
|
|
118
118
|
const summary = 'Intent: v0.6.3 search engine | Son: commit atıldı';
|
|
119
119
|
env.db.prepare(`INSERT INTO episodes (kind, scope, project, summary, session_summary, status, created_at)
|
|
120
120
|
VALUES ('session-summary', 'project', 'test-proj', ?, ?, 'active', datetime('now'))`).run(summary, summary);
|
|
121
|
-
const payload = (0, session_payload_js_1.buildSessionPayload)(env.db, env.tmpDir, 'test-proj', 5000);
|
|
121
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)({ db: env.db, baseDir: env.tmpDir, project: 'test-proj', tokenBudget: 5000 });
|
|
122
122
|
const pastSessions = payload.sections.find(s => s.label === 'Past Sessions');
|
|
123
123
|
expect(pastSessions).toBeDefined();
|
|
124
124
|
expect(pastSessions.content).toContain('v0.6.3 search engine');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-summary.test.js","sourceRoot":"","sources":["../../tests/session-summary.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,sEAAyF;AACzF,0EAAwE;AACxE,wEAAoF;AACpF,0EAAoE;AACpE,2CAAsG;AAEtG,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,UAAU,GAAG;YACjB,KAAK;YACL,WAAW;YACX,mBAAmB;YACnB,KAAK;YACL,EAAE;YACF,SAAS;YACT,EAAE;YACF,iBAAiB;YACjB,EAAE;YACF,cAAc;YACd,EAAE;YACF,oBAAoB;YACpB,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,OAAO,GAAG,IAAA,0CAAqB,EAAC,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,UAAU,GAAG;YACjB,KAAK;YACL,WAAW;YACX,KAAK;YACL,EAAE;YACF,SAAS;YACT,EAAE;YACF,sBAAsB;YACtB,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,OAAO,GAAG,IAAA,0CAAqB,EAAC,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,UAAU,GAAG;YACjB,KAAK;YACL,WAAW;YACX,KAAK;YACL,EAAE;YACF,SAAS;YACT,EAAE;YACF,yBAAyB;YACzB,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,OAAO,GAAG,IAAA,0CAAqB,EAAC,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,gCAAgC,CAAC;QAC9C,MAAM,WAAW,GAAG,sCAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,UAAU,GAAG;YACjB,KAAK;YACL,WAAW;YACX,KAAK;YACL,EAAE;YACF,SAAS;YACT,EAAE;YACF,mBAAmB;YACnB,EAAE;YACF,cAAc;YACd,EAAE;YACF,QAAQ;YACR,EAAE;YACF,SAAS;YACT,EAAE;YACF,UAAU;YACV,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,OAAO,GAAG,IAAA,0CAAqB,EAAC,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,OAAO,GAAG,IAAA,0CAAqB,EAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,UAAU,GAAG;YACjB,KAAK;YACL,WAAW;YACX,KAAK;YACL,EAAE;YACF,cAAc;YACd,EAAE;YACF,OAAO;YACP,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,OAAO,GAAG,IAAA,0CAAqB,EAAC,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,IAAI,GAAoB,CAAC;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,IAAA,6BAAqB,EAAC,qBAAqB,CAAC,CAAC;QACnD,IAAA,qCAAiB,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAA,iCAAa,EAAC,GAAG,CAAC,EAAE,EAAE,oCAAe,CAAC,CAAC;QACvC,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE,CAAC,IAAA,8BAAsB,EAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QAEpE,MAAM,OAAO,GAAG,mDAAmD,CAAC;QACpE,GAAG,CAAC,EAAE,CAAC,OAAO,CACZ;2FACqF,CACtF,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAExB,MAAM,OAAO,GAAG,IAAA,wCAAmB,EAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"session-summary.test.js","sourceRoot":"","sources":["../../tests/session-summary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-skill.test.d.ts","sourceRoot":"","sources":["../../tests/stats-skill.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const SKILL_DIR = path_1.default.join(__dirname, '..', 'skills', 'mindlore-stats');
|
|
9
|
+
const SKILL_FILE = path_1.default.join(SKILL_DIR, 'SKILL.md');
|
|
10
|
+
const PLUGIN_JSON = path_1.default.join(__dirname, '..', 'plugin.json');
|
|
11
|
+
describe('/mindlore-stats skill', () => {
|
|
12
|
+
let skillContent;
|
|
13
|
+
let pluginData;
|
|
14
|
+
beforeAll(() => {
|
|
15
|
+
skillContent = fs_1.default.readFileSync(SKILL_FILE, 'utf8');
|
|
16
|
+
pluginData = JSON.parse(fs_1.default.readFileSync(PLUGIN_JSON, 'utf8'));
|
|
17
|
+
});
|
|
18
|
+
test('skill directory exists', () => {
|
|
19
|
+
expect(fs_1.default.existsSync(SKILL_DIR)).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
test('SKILL.md exists and is non-empty', () => {
|
|
22
|
+
expect(skillContent.length).toBeGreaterThan(100);
|
|
23
|
+
});
|
|
24
|
+
test('SKILL.md has valid frontmatter', () => {
|
|
25
|
+
expect(skillContent.startsWith('---')).toBe(true);
|
|
26
|
+
const endIdx = skillContent.indexOf('---', 3);
|
|
27
|
+
expect(endIdx).toBeGreaterThan(3);
|
|
28
|
+
const frontmatter = skillContent.slice(3, endIdx);
|
|
29
|
+
expect(frontmatter).toContain('name: mindlore-stats');
|
|
30
|
+
expect(frontmatter).toContain('description:');
|
|
31
|
+
});
|
|
32
|
+
test('SKILL.md specifies fork context', () => {
|
|
33
|
+
expect(skillContent).toContain('context: fork');
|
|
34
|
+
});
|
|
35
|
+
test('SKILL.md references telemetry.jsonl', () => {
|
|
36
|
+
expect(skillContent).toContain('telemetry.jsonl');
|
|
37
|
+
});
|
|
38
|
+
test('SKILL.md references mindlore.db', () => {
|
|
39
|
+
expect(skillContent).toContain('mindlore.db');
|
|
40
|
+
});
|
|
41
|
+
test('registered in plugin.json', () => {
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- pluginData parsed from JSON
|
|
43
|
+
const skills = pluginData.skills;
|
|
44
|
+
const statsSkill = skills.find(s => s.name === 'mindlore-stats' || s.path?.includes('mindlore-stats'));
|
|
45
|
+
expect(statsSkill).toBeDefined();
|
|
46
|
+
});
|
|
47
|
+
test('allowed-tools are restricted to read-only', () => {
|
|
48
|
+
const toolsMatch = skillContent.match(/allowed-tools:\s*\[([^\]]+)\]/);
|
|
49
|
+
expect(toolsMatch).toBeTruthy();
|
|
50
|
+
const tools = toolsMatch[1].split(',').map(t => t.trim());
|
|
51
|
+
expect(tools).not.toContain('Write');
|
|
52
|
+
expect(tools).not.toContain('Edit');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=stats-skill.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-skill.test.js","sourceRoot":"","sources":["../../tests/stats-skill.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -749,6 +749,40 @@ function withTimeoutDb(db, sql, params = [], { timeoutMs = 3000, mode = 'all' }
|
|
|
749
749
|
}
|
|
750
750
|
}
|
|
751
751
|
|
|
752
|
+
function checkReflectTrigger(db, project, threshold) {
|
|
753
|
+
if (threshold === undefined) threshold = 5;
|
|
754
|
+
try {
|
|
755
|
+
const row = withTimeoutDb(db,
|
|
756
|
+
"SELECT COUNT(*) as cnt FROM episodes WHERE kind = 'nomination' AND status = 'staged' AND project = ?",
|
|
757
|
+
[project], { mode: 'get' });
|
|
758
|
+
const cnt = row?.cnt ?? 0;
|
|
759
|
+
if (cnt >= threshold) {
|
|
760
|
+
return `[Mindlore] ${cnt} bekleyen nomination var — \`/mindlore-reflect\` çalıştır`;
|
|
761
|
+
}
|
|
762
|
+
} catch (_err) { /* episodes table may not exist */ }
|
|
763
|
+
return null;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
function cleanupExpiredInjectLog(db, ttlMs) {
|
|
767
|
+
if (ttlMs === undefined) ttlMs = 30 * 24 * 60 * 60 * 1000;
|
|
768
|
+
try {
|
|
769
|
+
const cutoff = new Date(Date.now() - ttlMs).toISOString();
|
|
770
|
+
const result = db.prepare('DELETE FROM episode_inject_log WHERE injected_at < ?').run(cutoff);
|
|
771
|
+
return result.changes;
|
|
772
|
+
} catch (_err) { /* table may not exist */ }
|
|
773
|
+
return 0;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
function getGraduatedLessonCount(db, project) {
|
|
777
|
+
try {
|
|
778
|
+
const row = withTimeoutDb(db,
|
|
779
|
+
"SELECT COUNT(*) as cnt FROM episodes WHERE kind = 'nomination' AND status = 'approved' AND graduated_at IS NOT NULL AND project = ?",
|
|
780
|
+
[project], { mode: 'get' });
|
|
781
|
+
return row?.cnt ?? 0;
|
|
782
|
+
} catch (_err) { /* columns may not exist yet */ }
|
|
783
|
+
return 0;
|
|
784
|
+
}
|
|
785
|
+
|
|
752
786
|
module.exports = {
|
|
753
787
|
MINDLORE_DIR,
|
|
754
788
|
GLOBAL_MINDLORE_DIR,
|
|
@@ -832,6 +866,10 @@ module.exports = {
|
|
|
832
866
|
// DB corruption recovery (v0.6.3)
|
|
833
867
|
isCorruptionError,
|
|
834
868
|
recoverCorruptDb,
|
|
869
|
+
// Lesson graduation (v0.6.7)
|
|
870
|
+
checkReflectTrigger,
|
|
871
|
+
getGraduatedLessonCount,
|
|
872
|
+
cleanupExpiredInjectLog,
|
|
835
873
|
};
|
|
836
874
|
|
|
837
875
|
function isCorruptionError(err) {
|
|
@@ -151,7 +151,8 @@ function main() {
|
|
|
151
151
|
|
|
152
152
|
const headingStr = headings.length > 0 ? `\nBasliklar: ${headings.join(', ')}` : '';
|
|
153
153
|
const tagsStr = r.tags ? `\nTags: ${r.tags}` : '';
|
|
154
|
-
const
|
|
154
|
+
const snippetOrDesc = r.snippet || description;
|
|
155
|
+
const entry = `[Mindlore: ${category}/${title}] ${snippetOrDesc}\nDosya: ${relativePath}${tagsStr}${headingStr}`;
|
|
155
156
|
const truncated = entry.slice(0, perResultChars);
|
|
156
157
|
totalUsed += truncated.length;
|
|
157
158
|
output.push(truncated);
|
|
@@ -13,7 +13,7 @@ const fs = require('fs');
|
|
|
13
13
|
const path = require('path');
|
|
14
14
|
const os = require('os');
|
|
15
15
|
const { execFileSync, spawn } = require('child_process');
|
|
16
|
-
const { findMindloreDir, globalDir, getProjectName, openDatabase, ensureEpisodesTable, hasEpisodesTable, insertBareEpisode, insertFtsRow, hookLog, SHARED_EXPORT_DIRS, resolveWin32Bin, withTelemetry, getUnpromotedRawFiles } = require('./lib/mindlore-common.cjs');
|
|
16
|
+
const { findMindloreDir, globalDir, getProjectName, openDatabase, ensureEpisodesTable, hasEpisodesTable, insertBareEpisode, insertFtsRow, hookLog, SHARED_EXPORT_DIRS, resolveWin32Bin, withTelemetry, getUnpromotedRawFiles, cleanupExpiredInjectLog } = require('./lib/mindlore-common.cjs');
|
|
17
17
|
|
|
18
18
|
const EXPORT_DIRS = SHARED_EXPORT_DIRS;
|
|
19
19
|
|
|
@@ -323,6 +323,9 @@ function writeBareEpisode(baseDir, project, commits, changedFiles, reads) {
|
|
|
323
323
|
});
|
|
324
324
|
writeBoth();
|
|
325
325
|
|
|
326
|
+
// TTL cleanup for episode_inject_log (R4)
|
|
327
|
+
try { cleanupExpiredInjectLog(db); } catch (_err) { /* cleanup is optional */ }
|
|
328
|
+
|
|
326
329
|
db.close();
|
|
327
330
|
} catch (err) {
|
|
328
331
|
hookLog('session-end', 'error', `episode write failed: ${err?.message ?? err}`);
|
|
@@ -10,30 +10,65 @@
|
|
|
10
10
|
|
|
11
11
|
const fs = require('fs');
|
|
12
12
|
const path = require('path');
|
|
13
|
-
const { findMindloreDir, readConfig, openDatabase, hasEpisodesTable, querySupersededChains, formatSupersededChains, hookLog, getProjectName, parseFrontmatter, withTelemetry, withTimeoutDb, listSnapshots, isCorruptionError, recoverCorruptDb } = require('./lib/mindlore-common.cjs');
|
|
13
|
+
const { findMindloreDir, readConfig, openDatabase, hasEpisodesTable, querySupersededChains, formatSupersededChains, hookLog, getProjectName, parseFrontmatter, withTelemetry, withTimeoutDb, listSnapshots, isCorruptionError, recoverCorruptDb, checkReflectTrigger, getGraduatedLessonCount } = require('./lib/mindlore-common.cjs');
|
|
14
|
+
|
|
15
|
+
function truncateSection(content, sectionRegex, keepCount, label) {
|
|
16
|
+
const match = content.match(sectionRegex);
|
|
17
|
+
if (!match) return content;
|
|
18
|
+
const lines = match[2].trim().split('\n');
|
|
19
|
+
if (lines.length <= keepCount) return content;
|
|
20
|
+
const kept = lines.slice(0, keepCount).join('\n');
|
|
21
|
+
return content.replace(match[2].trim(), kept + `\n- ...ve ${lines.length - keepCount} ${label} daha`);
|
|
22
|
+
}
|
|
14
23
|
|
|
15
24
|
function truncateCommits(content) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const truncated = kept + `\n- ...ve ${lines.length - 5} commit daha`;
|
|
22
|
-
return content.replace(commitMatch[2].trim(), truncated);
|
|
25
|
+
return truncateSection(content, /(## Commits\n)((?:- [^\n]+\n?)+)/, 5, 'commit');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function truncateChangedFiles(content) {
|
|
29
|
+
return truncateSection(content, /(## Changed Files\n)((?:- [^\n]+\n?)+)/, 10, 'dosya');
|
|
23
30
|
}
|
|
24
31
|
|
|
25
32
|
function tryOpenDb(dbPath) {
|
|
26
33
|
return openDatabase(dbPath, { readonly: true });
|
|
27
34
|
}
|
|
28
35
|
|
|
29
|
-
function
|
|
36
|
+
function getEpisodeStats(db, config, project) {
|
|
37
|
+
const chains = querySupersededChains(db, { project, days: 7, limit: 5 });
|
|
38
|
+
let consolidationMsg = null;
|
|
39
|
+
try {
|
|
40
|
+
const rawCount = withTimeoutDb(db,
|
|
41
|
+
"SELECT COUNT(*) as cnt FROM episodes WHERE consolidation_status = 'raw' OR consolidation_status IS NULL",
|
|
42
|
+
[], { mode: 'get' });
|
|
43
|
+
const cnt = rawCount?.cnt ?? 0;
|
|
44
|
+
const consolThreshold = config?.consolidation?.threshold ?? 50;
|
|
45
|
+
if (cnt >= consolThreshold) {
|
|
46
|
+
consolidationMsg = `[Mindlore] ${cnt} raw episode birikti — \`/mindlore-maintain consolidate\` ile birleştirmeyi düşün.`;
|
|
47
|
+
}
|
|
48
|
+
} catch (_err) { /* consolidation_status column may not exist yet */ }
|
|
49
|
+
return { chains, consolidationMsg };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function checkStaleContent(db) {
|
|
53
|
+
try {
|
|
54
|
+
const thirtyDaysAgo = new Date(Date.now() - (30 * 24 * 60 * 60 * 1000)).toISOString();
|
|
55
|
+
const row = withTimeoutDb(db, 'SELECT COUNT(*) as cnt FROM file_hashes WHERE last_indexed < ?', [thirtyDaysAgo], { mode: 'get' });
|
|
56
|
+
const staleCount = row?.cnt ?? 0;
|
|
57
|
+
if (staleCount > 3) {
|
|
58
|
+
return `[Mindlore: ${staleCount} dosya 30+ gundur guncellenmemis — \`/mindlore-evolve\` dusun]`;
|
|
59
|
+
}
|
|
60
|
+
} catch (_staleErr) { /* file_hashes may not exist */ }
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function loadDbContent({ db, baseDir, config, output, timings, latestDeltaContent, sessionId }) {
|
|
65
|
+
const project = path.basename(process.cwd());
|
|
30
66
|
// Session payload: Session summary, Decisions, Friction, Learnings
|
|
31
67
|
const tPayload = Date.now();
|
|
32
68
|
try {
|
|
33
69
|
const { buildSessionPayload } = require('../dist/scripts/lib/session-payload.js');
|
|
34
|
-
const project = path.basename(process.cwd());
|
|
35
70
|
const payloadBudget = config?.tokenBudget?.sessionInject ?? 2000;
|
|
36
|
-
const payload = buildSessionPayload(db, baseDir, project, payloadBudget, latestDeltaContent);
|
|
71
|
+
const payload = buildSessionPayload({ db, baseDir, project, tokenBudget: payloadBudget, latestDeltaContent, sessionId });
|
|
37
72
|
for (const section of payload.sections) {
|
|
38
73
|
output.push(`[Mindlore ${section.label}]\n${section.content}`);
|
|
39
74
|
}
|
|
@@ -42,41 +77,40 @@ function loadDbContent(db, baseDir, config, output, timings, latestDeltaContent)
|
|
|
42
77
|
}
|
|
43
78
|
timings.db_payload = Date.now() - tPayload;
|
|
44
79
|
|
|
45
|
-
// Supersedes chain display
|
|
80
|
+
// Supersedes chain display + episode consolidation reminder
|
|
46
81
|
const tSuperseded = Date.now();
|
|
47
82
|
if (hasEpisodesTable(db)) {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
const chains = querySupersededChains(db, { project, days: 7, limit: 5 });
|
|
83
|
+
const { chains, consolidationMsg } = getEpisodeStats(db, config, project);
|
|
51
84
|
if (chains.length > 0) {
|
|
52
85
|
output.push(`[Mindlore Supersedes]\n${formatSupersededChains(chains)}`);
|
|
53
86
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const rawCount = withTimeoutDb(db,
|
|
58
|
-
"SELECT COUNT(*) as cnt FROM episodes WHERE consolidation_status = 'raw' OR consolidation_status IS NULL",
|
|
59
|
-
[], { mode: 'get' });
|
|
60
|
-
const cnt = rawCount?.cnt ?? 0;
|
|
61
|
-
const consolThreshold = config?.consolidation?.threshold ?? 50;
|
|
62
|
-
if (cnt >= consolThreshold) {
|
|
63
|
-
output.push(`[Mindlore] ${cnt} raw episode birikti — \`/mindlore-maintain consolidate\` ile birleştirmeyi düşün.`);
|
|
64
|
-
}
|
|
65
|
-
} catch (_err) { /* consolidation_status column may not exist yet */ }
|
|
87
|
+
if (consolidationMsg) {
|
|
88
|
+
output.push(consolidationMsg);
|
|
89
|
+
}
|
|
66
90
|
}
|
|
67
91
|
timings.db_episodes = Date.now() - tSuperseded;
|
|
68
92
|
|
|
69
93
|
// Stale content check
|
|
70
94
|
const tStale = Date.now();
|
|
95
|
+
const staleMsg = checkStaleContent(db);
|
|
96
|
+
if (staleMsg) {
|
|
97
|
+
output.push(staleMsg);
|
|
98
|
+
}
|
|
99
|
+
timings.db_stale = Date.now() - tStale;
|
|
100
|
+
|
|
101
|
+
// Auto reflect trigger (Q1)
|
|
71
102
|
try {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
103
|
+
const reflectMsg = checkReflectTrigger(db, project, config?.graduation?.reflectThreshold);
|
|
104
|
+
if (reflectMsg) output.push(reflectMsg);
|
|
105
|
+
} catch (_reflectErr) { /* graduation not available */ }
|
|
106
|
+
|
|
107
|
+
// Graduated lesson count (Q3 — content lives in CLAUDE.md, only show count)
|
|
108
|
+
try {
|
|
109
|
+
const gradCount = getGraduatedLessonCount(db, project);
|
|
110
|
+
if (gradCount > 0) {
|
|
111
|
+
output.push(`[Mindlore] ${gradCount} graduated lesson aktif (detay: CLAUDE.md veya /mindlore-reflect)`);
|
|
77
112
|
}
|
|
78
|
-
} catch (
|
|
79
|
-
timings.db_stale = Date.now() - tStale;
|
|
113
|
+
} catch (_lessonErr) { /* graduation not available */ }
|
|
80
114
|
}
|
|
81
115
|
|
|
82
116
|
function main() {
|
|
@@ -84,6 +118,13 @@ function main() {
|
|
|
84
118
|
const baseDir = findMindloreDir();
|
|
85
119
|
if (!baseDir) return; // No .mindlore/ found, silently skip
|
|
86
120
|
|
|
121
|
+
// Read session_id from stdin (Claude Code passes { session_id } to SessionStart hooks)
|
|
122
|
+
let sessionId;
|
|
123
|
+
try {
|
|
124
|
+
const stdinData = JSON.parse(fs.readFileSync(0, 'utf8') || '{}');
|
|
125
|
+
sessionId = stdinData.session_id || undefined;
|
|
126
|
+
} catch { sessionId = undefined; }
|
|
127
|
+
|
|
87
128
|
const output = [];
|
|
88
129
|
const config = readConfig(baseDir);
|
|
89
130
|
const timings = {};
|
|
@@ -117,7 +158,7 @@ function main() {
|
|
|
117
158
|
const deltaProject = meta.project || null;
|
|
118
159
|
const currentProject = getProjectName();
|
|
119
160
|
if (!deltaProject || deltaProject.toLowerCase() === currentProject.toLowerCase()) {
|
|
120
|
-
output.push(`[Mindlore Delta: ${latestName}]\n${truncateCommits(deltaContent)}`);
|
|
161
|
+
output.push(`[Mindlore Delta: ${latestName}]\n${truncateChangedFiles(truncateCommits(deltaContent))}`);
|
|
121
162
|
}
|
|
122
163
|
}
|
|
123
164
|
|
|
@@ -158,7 +199,19 @@ function main() {
|
|
|
158
199
|
|
|
159
200
|
if (db) {
|
|
160
201
|
try {
|
|
161
|
-
|
|
202
|
+
// Schema version check: warn if DB is behind expected version
|
|
203
|
+
const tSchema = Date.now();
|
|
204
|
+
try {
|
|
205
|
+
const { EXPECTED_SCHEMA_VERSION } = require('../dist/scripts/lib/all-migrations.js');
|
|
206
|
+
const row = db.prepare('SELECT MAX(version) as v FROM schema_versions').get();
|
|
207
|
+
const current = row?.v ?? 0;
|
|
208
|
+
if (current < EXPECTED_SCHEMA_VERSION) {
|
|
209
|
+
output.push(`[Mindlore: schema güncel değil (v${current} → v${EXPECTED_SCHEMA_VERSION}). \`npx mindlore upgrade\` çalıştır.]`);
|
|
210
|
+
}
|
|
211
|
+
} catch (_schemaErr) { /* schema_versions may not exist yet */ }
|
|
212
|
+
timings.schema_check = Date.now() - tSchema;
|
|
213
|
+
|
|
214
|
+
loadDbContent({ db, baseDir, config, output, timings, latestDeltaContent, sessionId });
|
|
162
215
|
} catch (err) {
|
|
163
216
|
if (isCorruptionError(err)) {
|
|
164
217
|
recoverCorruptDb(db, dbPath, 'session-focus');
|
|
@@ -200,3 +253,7 @@ withTelemetry('mindlore-session-focus', main).catch(err => {
|
|
|
200
253
|
hookLog('mindlore-session-focus', 'error', err?.message ?? String(err));
|
|
201
254
|
process.exit(0);
|
|
202
255
|
});
|
|
256
|
+
|
|
257
|
+
if (typeof module !== 'undefined') {
|
|
258
|
+
module.exports = { truncateCommits, truncateChangedFiles, getEpisodeStats, checkStaleContent };
|
|
259
|
+
}
|
package/package.json
CHANGED
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mindlore",
|
|
3
3
|
"description": "AI-native knowledge system for Claude Code. Persistent, searchable, evolving knowledge base with FTS5.",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.7",
|
|
5
5
|
"skills": [
|
|
6
6
|
{
|
|
7
7
|
"name": "mindlore-ingest",
|
|
@@ -52,6 +52,11 @@
|
|
|
52
52
|
"name": "mindlore-maintain",
|
|
53
53
|
"path": "skills/mindlore-maintain/SKILL.md",
|
|
54
54
|
"description": "KB maintenance — decay/archive stale documents, consolidate 50+ episodes into learnings/insights, detect contradictions. Modes: decay (stale doc archive with git snapshot), consolidate (episode→file promotion), contradictions (wiki-lint + semantic), restore (undo archive). Run without flags for full report."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "mindlore-stats",
|
|
58
|
+
"path": "skills/mindlore-stats/SKILL.md",
|
|
59
|
+
"description": "Show context contribution and cost per session — hook calls, durations, DB stats."
|
|
55
60
|
}
|
|
56
61
|
],
|
|
57
62
|
"agents": [
|
|
@@ -135,6 +135,17 @@ Required frontmatter fields include `source_type` — auto-detected:
|
|
|
135
135
|
- `pdf` for PDF Mode
|
|
136
136
|
- `file` for File Mode
|
|
137
137
|
|
|
138
|
+
### Extraction Template
|
|
139
|
+
|
|
140
|
+
After detecting `source_type`, check if a matching extraction template exists:
|
|
141
|
+
|
|
142
|
+
1. Read `~/.mindlore/templates/extraction/{source_type}.md`
|
|
143
|
+
2. If found, follow the "Extraction Instructions" section for source analysis
|
|
144
|
+
3. If not found, Read `~/.mindlore/templates/extraction/default.md` and follow that
|
|
145
|
+
4. User can override with `--type <type>` argument (e.g., `/mindlore-ingest https://example.com --type changelog`)
|
|
146
|
+
|
|
147
|
+
The template guides WHAT to extract from the source. Apply its instructions when writing the source summary in `sources/{slug}.md`.
|
|
148
|
+
|
|
138
149
|
## Quality Assessment
|
|
139
150
|
|
|
140
151
|
Assign quality automatically during ingest using this heuristic:
|
|
@@ -95,8 +95,18 @@ Onaylamak istediklerini sec, veya 'skip':
|
|
|
95
95
|
- `claude.md` -> project CLAUDE.md'ye kural ekle
|
|
96
96
|
- `domain:{slug}` -> ilgili domain sayfasina ekle
|
|
97
97
|
|
|
98
|
+
Approval SQL:
|
|
99
|
+
```sql
|
|
100
|
+
UPDATE episodes SET status = 'approved', graduated_at = datetime('now') WHERE id = ?
|
|
101
|
+
```
|
|
102
|
+
|
|
98
103
|
User rejects -> `status: staged -> rejected` + rejection reason
|
|
99
104
|
|
|
105
|
+
Rejection SQL:
|
|
106
|
+
```sql
|
|
107
|
+
UPDATE episodes SET status = 'rejected', rejected_at = datetime('now'), rejection_reason = ? WHERE id = ?
|
|
108
|
+
```
|
|
109
|
+
|
|
100
110
|
## On End — Write skill_memory
|
|
101
111
|
|
|
102
112
|
```bash
|