mindlore 0.7.3 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +18 -0
  4. package/dist/scripts/bundle-hooks.js +3 -4
  5. package/dist/scripts/bundle-hooks.js.map +1 -1
  6. package/dist/scripts/init.js +74 -20
  7. package/dist/scripts/init.js.map +1 -1
  8. package/dist/scripts/lib/constants.d.ts +21 -1
  9. package/dist/scripts/lib/constants.d.ts.map +1 -1
  10. package/dist/scripts/lib/constants.js +33 -7
  11. package/dist/scripts/lib/constants.js.map +1 -1
  12. package/dist/scripts/lib/db-helpers.d.ts +1 -0
  13. package/dist/scripts/lib/db-helpers.d.ts.map +1 -1
  14. package/dist/scripts/lib/db-helpers.js +37 -0
  15. package/dist/scripts/lib/db-helpers.js.map +1 -1
  16. package/dist/scripts/lib/detect-plugin.js +1 -1
  17. package/dist/scripts/lib/detect-plugin.js.map +1 -1
  18. package/dist/scripts/lib/episodes.d.ts +1 -1
  19. package/dist/scripts/lib/episodes.d.ts.map +1 -1
  20. package/dist/scripts/lib/episodes.js +1 -1
  21. package/dist/scripts/lib/episodes.js.map +1 -1
  22. package/dist/scripts/lib/hook-helpers.d.ts +8 -0
  23. package/dist/scripts/lib/hook-helpers.d.ts.map +1 -0
  24. package/dist/scripts/lib/hook-helpers.js +27 -0
  25. package/dist/scripts/lib/hook-helpers.js.map +1 -0
  26. package/dist/scripts/lib/mcp-namespace.d.ts.map +1 -1
  27. package/dist/scripts/lib/mcp-namespace.js +0 -5
  28. package/dist/scripts/lib/mcp-namespace.js.map +1 -1
  29. package/dist/scripts/lib/mcp-tools.d.ts.map +1 -1
  30. package/dist/scripts/lib/mcp-tools.js +3 -19
  31. package/dist/scripts/lib/mcp-tools.js.map +1 -1
  32. package/dist/scripts/lib/relation-helpers.js +1 -1
  33. package/dist/scripts/lib/relation-helpers.js.map +1 -1
  34. package/dist/scripts/lib/session-payload.d.ts.map +1 -1
  35. package/dist/scripts/lib/session-payload.js +7 -21
  36. package/dist/scripts/lib/session-payload.js.map +1 -1
  37. package/dist/scripts/lib/settings-cleanup.d.ts.map +1 -1
  38. package/dist/scripts/lib/settings-cleanup.js +2 -2
  39. package/dist/scripts/lib/settings-cleanup.js.map +1 -1
  40. package/dist/scripts/lib/skill-runner.d.ts +3 -0
  41. package/dist/scripts/lib/skill-runner.d.ts.map +1 -0
  42. package/dist/scripts/lib/skill-runner.js +78 -0
  43. package/dist/scripts/lib/skill-runner.js.map +1 -0
  44. package/dist/scripts/lib/telemetry-scan.d.ts +19 -0
  45. package/dist/scripts/lib/telemetry-scan.d.ts.map +1 -0
  46. package/dist/scripts/lib/telemetry-scan.js +42 -0
  47. package/dist/scripts/lib/telemetry-scan.js.map +1 -0
  48. package/dist/scripts/lib/tool-adapters/decide-adapter.d.ts +1 -1
  49. package/dist/scripts/lib/tool-adapters/decide-adapter.d.ts.map +1 -1
  50. package/dist/scripts/lib/tool-adapters/decide-adapter.js +5 -0
  51. package/dist/scripts/lib/tool-adapters/decide-adapter.js.map +1 -1
  52. package/dist/scripts/mindlore-clean-cache.d.ts +3 -0
  53. package/dist/scripts/mindlore-clean-cache.d.ts.map +1 -0
  54. package/dist/scripts/mindlore-clean-cache.js +65 -0
  55. package/dist/scripts/mindlore-clean-cache.js.map +1 -0
  56. package/dist/scripts/mindlore-doctor.d.ts +3 -0
  57. package/dist/scripts/mindlore-doctor.d.ts.map +1 -1
  58. package/dist/scripts/mindlore-doctor.js +84 -15
  59. package/dist/scripts/mindlore-doctor.js.map +1 -1
  60. package/dist/scripts/mindlore-health-check.js +2 -2
  61. package/dist/scripts/mindlore-health-check.js.map +1 -1
  62. package/dist/scripts/mindlore-perf.d.ts +3 -1
  63. package/dist/scripts/mindlore-perf.d.ts.map +1 -1
  64. package/dist/scripts/mindlore-perf.js +13 -6
  65. package/dist/scripts/mindlore-perf.js.map +1 -1
  66. package/dist/scripts/reflect-failure-scan.d.ts +3 -0
  67. package/dist/scripts/reflect-failure-scan.d.ts.map +1 -0
  68. package/dist/scripts/reflect-failure-scan.js +41 -0
  69. package/dist/scripts/reflect-failure-scan.js.map +1 -0
  70. package/dist/tests/clean-cache.test.d.ts +2 -0
  71. package/dist/tests/clean-cache.test.d.ts.map +1 -0
  72. package/dist/tests/clean-cache.test.js +59 -0
  73. package/dist/tests/clean-cache.test.js.map +1 -0
  74. package/dist/tests/db-helpers-vec.test.d.ts +2 -0
  75. package/dist/tests/db-helpers-vec.test.d.ts.map +1 -0
  76. package/dist/tests/db-helpers-vec.test.js +32 -0
  77. package/dist/tests/db-helpers-vec.test.js.map +1 -0
  78. package/dist/tests/db-helpers.test.d.ts +2 -0
  79. package/dist/tests/db-helpers.test.d.ts.map +1 -0
  80. package/dist/tests/db-helpers.test.js +30 -0
  81. package/dist/tests/db-helpers.test.js.map +1 -0
  82. package/dist/tests/diary.test.js +3 -3
  83. package/dist/tests/diary.test.js.map +1 -1
  84. package/dist/tests/doctor.test.js +39 -0
  85. package/dist/tests/doctor.test.js.map +1 -1
  86. package/dist/tests/dont-repeat-dedup.test.js +13 -1
  87. package/dist/tests/dont-repeat-dedup.test.js.map +1 -1
  88. package/dist/tests/episodes-inject.test.js +5 -5
  89. package/dist/tests/episodes-inject.test.js.map +1 -1
  90. package/dist/tests/fts5-sync.test.js +11 -117
  91. package/dist/tests/fts5-sync.test.js.map +1 -1
  92. package/dist/tests/hook-helpers.test.d.ts +2 -0
  93. package/dist/tests/hook-helpers.test.d.ts.map +1 -0
  94. package/dist/tests/hook-helpers.test.js +44 -0
  95. package/dist/tests/hook-helpers.test.js.map +1 -0
  96. package/dist/tests/init-spawn-cleanup.test.d.ts +2 -0
  97. package/dist/tests/init-spawn-cleanup.test.d.ts.map +1 -0
  98. package/dist/tests/init-spawn-cleanup.test.js +21 -0
  99. package/dist/tests/init-spawn-cleanup.test.js.map +1 -0
  100. package/dist/tests/install-matrix.test.js +39 -0
  101. package/dist/tests/install-matrix.test.js.map +1 -1
  102. package/dist/tests/latency-budget.test.d.ts +2 -0
  103. package/dist/tests/latency-budget.test.d.ts.map +1 -0
  104. package/dist/tests/latency-budget.test.js +37 -0
  105. package/dist/tests/latency-budget.test.js.map +1 -0
  106. package/dist/tests/learnings-loader.test.d.ts +2 -0
  107. package/dist/tests/learnings-loader.test.d.ts.map +1 -0
  108. package/dist/tests/learnings-loader.test.js +64 -0
  109. package/dist/tests/learnings-loader.test.js.map +1 -0
  110. package/dist/tests/mcp-namespace.test.d.ts +2 -0
  111. package/dist/tests/mcp-namespace.test.d.ts.map +1 -0
  112. package/dist/tests/mcp-namespace.test.js +41 -0
  113. package/dist/tests/mcp-namespace.test.js.map +1 -0
  114. package/dist/tests/mindlore-home-env.test.d.ts +2 -0
  115. package/dist/tests/mindlore-home-env.test.d.ts.map +1 -0
  116. package/dist/tests/mindlore-home-env.test.js +33 -0
  117. package/dist/tests/mindlore-home-env.test.js.map +1 -0
  118. package/dist/tests/no-hardcoded-cache.test.d.ts +2 -0
  119. package/dist/tests/no-hardcoded-cache.test.d.ts.map +1 -0
  120. package/dist/tests/no-hardcoded-cache.test.js +40 -0
  121. package/dist/tests/no-hardcoded-cache.test.js.map +1 -0
  122. package/dist/tests/nomination.test.js +1 -1
  123. package/dist/tests/nomination.test.js.map +1 -1
  124. package/dist/tests/reflect-failure-scan.test.d.ts +2 -0
  125. package/dist/tests/reflect-failure-scan.test.d.ts.map +1 -0
  126. package/dist/tests/reflect-failure-scan.test.js +49 -0
  127. package/dist/tests/reflect-failure-scan.test.js.map +1 -0
  128. package/dist/tests/reflect-trigger.test.d.ts +2 -0
  129. package/dist/tests/reflect-trigger.test.d.ts.map +1 -0
  130. package/dist/tests/reflect-trigger.test.js +31 -0
  131. package/dist/tests/reflect-trigger.test.js.map +1 -0
  132. package/dist/tests/session-focus-episode-counter.test.d.ts +2 -0
  133. package/dist/tests/session-focus-episode-counter.test.d.ts.map +1 -0
  134. package/dist/tests/session-focus-episode-counter.test.js +41 -0
  135. package/dist/tests/session-focus-episode-counter.test.js.map +1 -0
  136. package/dist/tests/session-focus-learnings-inject.test.d.ts +2 -0
  137. package/dist/tests/session-focus-learnings-inject.test.d.ts.map +1 -0
  138. package/dist/tests/session-focus-learnings-inject.test.js +29 -0
  139. package/dist/tests/session-focus-learnings-inject.test.js.map +1 -0
  140. package/dist/tests/session-focus-nomination-inject.test.d.ts +2 -0
  141. package/dist/tests/session-focus-nomination-inject.test.d.ts.map +1 -0
  142. package/dist/tests/session-focus-nomination-inject.test.js +50 -0
  143. package/dist/tests/session-focus-nomination-inject.test.js.map +1 -0
  144. package/dist/tests/session-focus-reflect-nudge.test.d.ts +2 -0
  145. package/dist/tests/session-focus-reflect-nudge.test.d.ts.map +1 -0
  146. package/dist/tests/session-focus-reflect-nudge.test.js +62 -0
  147. package/dist/tests/session-focus-reflect-nudge.test.js.map +1 -0
  148. package/dist/tests/session-payload.test.js +19 -17
  149. package/dist/tests/session-payload.test.js.map +1 -1
  150. package/dist/tests/skill-md-uses-runner.test.d.ts +2 -0
  151. package/dist/tests/skill-md-uses-runner.test.d.ts.map +1 -0
  152. package/dist/tests/skill-md-uses-runner.test.js +31 -0
  153. package/dist/tests/skill-md-uses-runner.test.js.map +1 -0
  154. package/dist/tests/skill-runner-failure-e2e.test.d.ts +10 -0
  155. package/dist/tests/skill-runner-failure-e2e.test.d.ts.map +1 -0
  156. package/dist/tests/skill-runner-failure-e2e.test.js +64 -0
  157. package/dist/tests/skill-runner-failure-e2e.test.js.map +1 -0
  158. package/dist/tests/skill-runner.test.d.ts +2 -0
  159. package/dist/tests/skill-runner.test.d.ts.map +1 -0
  160. package/dist/tests/skill-runner.test.js +55 -0
  161. package/dist/tests/skill-runner.test.js.map +1 -0
  162. package/dist/tests/sync-scripts.test.d.ts +2 -0
  163. package/dist/tests/sync-scripts.test.d.ts.map +1 -0
  164. package/dist/tests/sync-scripts.test.js +26 -0
  165. package/dist/tests/sync-scripts.test.js.map +1 -0
  166. package/dist/tests/telemetry-perf.test.js +9 -8
  167. package/dist/tests/telemetry-perf.test.js.map +1 -1
  168. package/dist/tests/telemetry-scan.test.d.ts +2 -0
  169. package/dist/tests/telemetry-scan.test.d.ts.map +1 -0
  170. package/dist/tests/telemetry-scan.test.js +32 -0
  171. package/dist/tests/telemetry-scan.test.js.map +1 -0
  172. package/hooks/cc-memory-bulk-sync.cjs +20 -5
  173. package/hooks/cc-session-sync.cjs +20 -5
  174. package/hooks/lib/constants.cjs +1 -1
  175. package/hooks/lib/learnings-loader.cjs +70 -0
  176. package/hooks/lib/mindlore-common.cjs +46 -8
  177. package/hooks/lib/reflect-trigger.cjs +29 -0
  178. package/hooks/lib/sync-scripts.cjs +12 -0
  179. package/hooks/mindlore-fts5-sync.cjs +5 -1
  180. package/hooks/mindlore-search.cjs +116 -14
  181. package/hooks/mindlore-session-focus.cjs +81 -27
  182. package/hooks/src/lib/mindlore-common.cjs +5 -0
  183. package/hooks/src/mindlore-fts5-sync.cjs +7 -4
  184. package/hooks/src/mindlore-search.cjs +19 -11
  185. package/hooks/src/mindlore-session-focus.cjs +48 -6
  186. package/package.json +5 -3
  187. package/plugin.json +1 -1
  188. package/skills/mindlore-decide/SKILL.md +1 -1
  189. package/skills/mindlore-diary/SKILL.md +4 -4
  190. package/skills/mindlore-evolve/SKILL.md +2 -2
  191. package/skills/mindlore-health/SKILL.md +2 -2
  192. package/skills/mindlore-ingest/SKILL.md +7 -7
  193. package/skills/mindlore-log/SKILL.md +1 -1
  194. package/skills/mindlore-maintain/SKILL.md +2 -2
  195. package/skills/mindlore-query/SKILL.md +1 -1
  196. package/skills/mindlore-reflect/SKILL.md +30 -16
  197. package/templates/config.json +1 -1
@@ -106,5 +106,44 @@ describe('Install Matrix — 4 scenarios', () => {
106
106
  expect(commands.some((c) => c.includes('mindlore-custom-hook'))).toBe(true);
107
107
  });
108
108
  });
109
+ describe('Scenario 5: Skill/Agent cleanup when plugin installed', () => {
110
+ let tmpSkillsDir;
111
+ let tmpAgentsDir;
112
+ beforeEach(() => {
113
+ tmpSkillsDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-skills-'));
114
+ tmpAgentsDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-agents-'));
115
+ });
116
+ afterEach(() => {
117
+ fs_1.default.rmSync(tmpSkillsDir, { recursive: true, force: true });
118
+ fs_1.default.rmSync(tmpAgentsDir, { recursive: true, force: true });
119
+ });
120
+ it('removes legacy skill dirs when plugin is installed', () => {
121
+ const skillNames = ['mindlore-decide', 'mindlore-health', 'mindlore-query'];
122
+ for (const name of skillNames) {
123
+ const dir = path_1.default.join(tmpSkillsDir, name);
124
+ fs_1.default.mkdirSync(dir);
125
+ fs_1.default.writeFileSync(path_1.default.join(dir, 'SKILL.md'), '# test');
126
+ }
127
+ // Non-mindlore skill should survive
128
+ const userSkill = path_1.default.join(tmpSkillsDir, 'my-custom-skill');
129
+ fs_1.default.mkdirSync(userSkill);
130
+ fs_1.default.writeFileSync(path_1.default.join(userSkill, 'SKILL.md'), '# custom');
131
+ const plugin = { skills: skillNames.map(n => ({ name: n, path: `skills/${n}/SKILL.md` })) };
132
+ for (const skill of plugin.skills) {
133
+ const destDir = path_1.default.join(tmpSkillsDir, skill.name);
134
+ if (fs_1.default.existsSync(destDir)) {
135
+ fs_1.default.rmSync(destDir, { recursive: true });
136
+ }
137
+ }
138
+ expect(fs_1.default.existsSync(path_1.default.join(tmpSkillsDir, 'mindlore-decide'))).toBe(false);
139
+ expect(fs_1.default.existsSync(path_1.default.join(tmpSkillsDir, 'mindlore-health'))).toBe(false);
140
+ expect(fs_1.default.existsSync(path_1.default.join(tmpSkillsDir, 'my-custom-skill'))).toBe(true);
141
+ });
142
+ it('handles missing skills dir gracefully', () => {
143
+ const missingDir = path_1.default.join(os_1.default.tmpdir(), 'mindlore-nonexistent-' + Date.now());
144
+ expect(fs_1.default.existsSync(missingDir)).toBe(false);
145
+ // No error thrown
146
+ });
147
+ });
109
148
  });
110
149
  //# sourceMappingURL=install-matrix.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-matrix.test.js","sourceRoot":"","sources":["../../tests/install-matrix.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-matrix.test.js","sourceRoot":"","sources":["../../tests/install-matrix.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=latency-budget.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-budget.test.d.ts","sourceRoot":"","sources":["../../tests/latency-budget.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ describe('latency budget', () => {
4
+ it('HOOK_LATENCY_BUDGETS has entry for all known hooks', () => {
5
+ const common = require('../hooks/lib/mindlore-common.cjs');
6
+ const budgets = common.HOOK_LATENCY_BUDGETS;
7
+ expect(Object.keys(budgets).length).toBe(14);
8
+ expect(budgets['mindlore-session-focus']).toBe(100);
9
+ expect(budgets['mindlore-read-guard']).toBe(30);
10
+ expect(budgets['mindlore-search']).toBe(50);
11
+ });
12
+ it('withTelemetrySync logs budget_exceeded in telemetry', () => {
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+ const os = require('os');
16
+ const common = require('../hooks/lib/mindlore-common.cjs');
17
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mindlore-budget-'));
18
+ const telPath = path.join(tmpDir, 'telemetry.jsonl');
19
+ // Override MINDLORE_HOME to use tmp telemetry
20
+ const origHome = process.env.MINDLORE_HOME;
21
+ process.env.MINDLORE_HOME = tmpDir;
22
+ // Slow function that exceeds 30ms budget
23
+ common.withTelemetrySync('mindlore-read-guard', () => {
24
+ const end = Date.now() + 50;
25
+ while (Date.now() < end) { } // busy wait
26
+ });
27
+ process.env.MINDLORE_HOME = origHome;
28
+ if (fs.existsSync(telPath)) {
29
+ const lines = fs.readFileSync(telPath, 'utf8').trim().split('\n');
30
+ const last = JSON.parse(lines[lines.length - 1]);
31
+ expect(last.budget_exceeded).toBe(true);
32
+ expect(last.budget_ms).toBe(30);
33
+ }
34
+ fs.rmSync(tmpDir, { recursive: true, force: true });
35
+ });
36
+ });
37
+ //# sourceMappingURL=latency-budget.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-budget.test.js","sourceRoot":"","sources":["../../tests/latency-budget.test.ts"],"names":[],"mappings":";;AAAA,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAE3D,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAErD,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC;QAEnC,yCAAyC;QACzC,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA,CAAC,CAAC,YAAY;QAC1C,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC;QAErC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=learnings-loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learnings-loader.test.d.ts","sourceRoot":"","sources":["../../tests/learnings-loader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
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 path_1 = __importDefault(require("path"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const { loadLearningsBlock } = require('../hooks/lib/learnings-loader.cjs');
10
+ let tmpDir;
11
+ beforeEach(() => {
12
+ tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'learnings-'));
13
+ fs_1.default.mkdirSync(path_1.default.join(tmpDir, 'learnings'));
14
+ });
15
+ afterEach(() => { fs_1.default.rmSync(tmpDir, { recursive: true, force: true }); });
16
+ function writeLesson(name, body, frontmatter = '') {
17
+ const fm = frontmatter ? `---\n${frontmatter}\n---\n\n` : '';
18
+ fs_1.default.writeFileSync(path_1.default.join(tmpDir, 'learnings', name), fm + body);
19
+ }
20
+ test('returns empty string when learnings dir is empty', () => {
21
+ expect(loadLearningsBlock(tmpDir, 'any-project')).toBe('');
22
+ });
23
+ test('returns empty string when learnings dir missing', () => {
24
+ fs_1.default.rmSync(path_1.default.join(tmpDir, 'learnings'), { recursive: true });
25
+ expect(loadLearningsBlock(tmpDir, 'any-project')).toBe('');
26
+ });
27
+ test('injects top-N lessons with truncation hint', () => {
28
+ for (let i = 0; i < 12; i++) {
29
+ writeLesson(`lesson-${i}.md`, `## Topic ${i}\n- rule line 1\n- rule line 2`, 'project: global');
30
+ }
31
+ const block = loadLearningsBlock(tmpDir, 'mindlore');
32
+ expect(block).toContain('[Mindlore Learnings]');
33
+ const headings = (block.match(/^## /gm) ?? []).length;
34
+ expect(headings).toBeLessThanOrEqual(10);
35
+ });
36
+ test('respects per-lesson 5-line cap and adds full-path hint', () => {
37
+ const long = Array.from({ length: 20 }, (_, i) => `- rule ${i}`).join('\n');
38
+ writeLesson('big.md', `## Big Topic\n${long}`, 'project: global');
39
+ const block = loadLearningsBlock(tmpDir, 'mindlore');
40
+ expect(block).toContain('… (full: .mindlore/learnings/big.md)');
41
+ });
42
+ test('scope filter: includes global and current project, excludes others', () => {
43
+ writeLesson('a.md', '## A\n- rule', 'project: global');
44
+ writeLesson('b.md', '## B\n- rule', 'project: mindlore');
45
+ writeLesson('c.md', '## C\n- rule', 'project: kastell');
46
+ const block = loadLearningsBlock(tmpDir, 'mindlore');
47
+ expect(block).toContain('## A');
48
+ expect(block).toContain('## B');
49
+ expect(block).not.toContain('## C');
50
+ });
51
+ test('missing project frontmatter is treated as global', () => {
52
+ writeLesson('legacy.md', '## Legacy\n- rule', '');
53
+ const block = loadLearningsBlock(tmpDir, 'mindlore');
54
+ expect(block).toContain('## Legacy');
55
+ });
56
+ test('total char cap reduces N when exceeded', () => {
57
+ const huge = '## Big\n' + 'x'.repeat(2000);
58
+ for (let i = 0; i < 10; i++) {
59
+ writeLesson(`l${i}.md`, huge, 'project: global');
60
+ }
61
+ const block = loadLearningsBlock(tmpDir, 'mindlore');
62
+ expect(block.length).toBeLessThanOrEqual(6500);
63
+ });
64
+ //# sourceMappingURL=learnings-loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learnings-loader.test.js","sourceRoot":"","sources":["../../tests/learnings-loader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-namespace.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-namespace.test.d.ts","sourceRoot":"","sources":["../../tests/mcp-namespace.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
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 path_1 = __importDefault(require("path"));
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const os_1 = __importDefault(require("os"));
9
+ // Mock before import
10
+ const originalCwd = process.cwd;
11
+ afterEach(() => {
12
+ process.cwd = originalCwd;
13
+ delete process.env.MINDLORE_HOME;
14
+ });
15
+ describe('resolveMindloreHome', () => {
16
+ let resolveMindloreHome;
17
+ beforeAll(async () => {
18
+ const mod = await import('../scripts/lib/mcp-namespace.js');
19
+ resolveMindloreHome = mod.resolveMindloreHome;
20
+ });
21
+ it('returns global path even when cwd has .mindlore/', () => {
22
+ const tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-test-'));
23
+ const localMindlore = path_1.default.join(tmpDir, '.mindlore');
24
+ fs_1.default.mkdirSync(localMindlore, { recursive: true });
25
+ process.cwd = () => tmpDir;
26
+ const result = resolveMindloreHome();
27
+ expect(result).toBe(path_1.default.join(os_1.default.homedir(), '.mindlore'));
28
+ fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
29
+ });
30
+ it('respects MINDLORE_HOME env var', () => {
31
+ const customDir = path_1.default.join(os_1.default.tmpdir(), 'custom-mindlore-' + Date.now());
32
+ process.env.MINDLORE_HOME = customDir;
33
+ const result = resolveMindloreHome();
34
+ expect(result).toBe(path_1.default.resolve(customDir));
35
+ });
36
+ it('returns ~/.mindlore by default', () => {
37
+ const result = resolveMindloreHome();
38
+ expect(result).toBe(path_1.default.join(os_1.default.homedir(), '.mindlore'));
39
+ });
40
+ });
41
+ //# sourceMappingURL=mcp-namespace.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-namespace.test.js","sourceRoot":"","sources":["../../tests/mcp-namespace.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AAEpB,qBAAqB;AACrB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;AAEhC,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,mBAAiC,CAAC;IAEtC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAC5D,mBAAmB,GAAG,GAAG,CAAC,mBAAmB,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACxE,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACrD,YAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;QAE3B,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QAE1D,YAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,SAAS,CAAC;QAEtC,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mindlore-home-env.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mindlore-home-env.test.d.ts","sourceRoot":"","sources":["../../tests/mindlore-home-env.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
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 path_1 = __importDefault(require("path"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const { resolveMindloreHome } = require('../hooks/lib/mindlore-common.cjs');
9
+ test('resolveMindloreHome returns MINDLORE_HOME when set', () => {
10
+ const saved = process.env.MINDLORE_HOME;
11
+ try {
12
+ process.env.MINDLORE_HOME = '/tmp/custom-mindlore';
13
+ expect(resolveMindloreHome()).toBe('/tmp/custom-mindlore');
14
+ }
15
+ finally {
16
+ if (saved === undefined)
17
+ delete process.env.MINDLORE_HOME;
18
+ else
19
+ process.env.MINDLORE_HOME = saved;
20
+ }
21
+ });
22
+ test('resolveMindloreHome falls back to ~/.mindlore', () => {
23
+ const saved = process.env.MINDLORE_HOME;
24
+ delete process.env.MINDLORE_HOME;
25
+ try {
26
+ expect(resolveMindloreHome()).toBe(path_1.default.join(os_1.default.homedir(), '.mindlore'));
27
+ }
28
+ finally {
29
+ if (saved !== undefined)
30
+ process.env.MINDLORE_HOME = saved;
31
+ }
32
+ });
33
+ //# sourceMappingURL=mindlore-home-env.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mindlore-home-env.test.js","sourceRoot":"","sources":["../../tests/mindlore-home-env.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;AAE5E,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,sBAAsB,CAAC;QACnD,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC7D,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;;YACrD,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC;IACzC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3E,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7D,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=no-hardcoded-cache.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-hardcoded-cache.test.d.ts","sourceRoot":"","sources":["../../tests/no-hardcoded-cache.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
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
+ function findTsFiles(dir) {
9
+ const results = [];
10
+ for (const entry of fs_1.default.readdirSync(dir, { withFileTypes: true })) {
11
+ const fullPath = path_1.default.join(dir, entry.name);
12
+ if (entry.isDirectory()) {
13
+ results.push(...findTsFiles(fullPath));
14
+ }
15
+ else if (entry.isFile() && entry.name.endsWith('.ts')) {
16
+ results.push(fullPath);
17
+ }
18
+ }
19
+ return results;
20
+ }
21
+ function fileContainsPluginCache(filePath) {
22
+ const content = fs_1.default.readFileSync(filePath, 'utf8');
23
+ // Match '.claude', 'plugins', 'cache' appearing in sequence (with any chars between)
24
+ return /['"]\.claude['"][\s\S]*?['"]plugins['"][\s\S]*?['"]cache['"]/.test(content);
25
+ }
26
+ test('no hardcoded plugin cache path outside constants.ts', () => {
27
+ const scriptsDir = path_1.default.join(__dirname, '..', 'scripts');
28
+ const files = findTsFiles(scriptsDir);
29
+ const violations = [];
30
+ for (const file of files) {
31
+ const relative = path_1.default.relative(path_1.default.join(__dirname, '..'), file);
32
+ if (relative.replace(/\\/g, '/') === 'scripts/lib/constants.ts')
33
+ continue;
34
+ if (fileContainsPluginCache(file)) {
35
+ violations.push(relative);
36
+ }
37
+ }
38
+ expect(violations).toEqual([]);
39
+ });
40
+ //# sourceMappingURL=no-hardcoded-cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-hardcoded-cache.test.js","sourceRoot":"","sources":["../../tests/no-hardcoded-cache.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAExB,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,YAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,qFAAqF;IACrF,OAAO,8DAA8D,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtF,CAAC;AAED,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,0BAA0B;YAAE,SAAS;QAC1E,IAAI,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC"}
@@ -14,7 +14,7 @@ afterEach(() => {
14
14
  describe('nomination kind', () => {
15
15
  test('EPISODE_KINDS includes nomination', () => {
16
16
  expect(episodes_js_1.EPISODE_KINDS).toContain('nomination');
17
- expect(episodes_js_1.EPISODE_KINDS).toHaveLength(9);
17
+ expect(episodes_js_1.EPISODE_KINDS).toHaveLength(10);
18
18
  });
19
19
  test('can create nomination episode', () => {
20
20
  const ep = (0, episodes_js_1.createEpisode)(db, {
@@ -1 +1 @@
1
- {"version":3,"file":"nomination.test.js","sourceRoot":"","sources":["../../tests/nomination.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nomination.test.js","sourceRoot":"","sources":["../../tests/nomination.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reflect-failure-scan.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflect-failure-scan.test.d.ts","sourceRoot":"","sources":["../../tests/reflect-failure-scan.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
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 path_1 = __importDefault(require("path"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
10
+ const child_process_1 = require("child_process");
11
+ let tmpHome;
12
+ let mindloreDir;
13
+ let dbPath;
14
+ let telemetryPath;
15
+ beforeEach(() => {
16
+ tmpHome = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-failscan-'));
17
+ mindloreDir = path_1.default.join(tmpHome, '.mindlore');
18
+ fs_1.default.mkdirSync(mindloreDir, { recursive: true });
19
+ dbPath = path_1.default.join(mindloreDir, 'mindlore.db');
20
+ telemetryPath = path_1.default.join(mindloreDir, 'telemetry.jsonl');
21
+ const db = new better_sqlite3_1.default(dbPath);
22
+ db.pragma('journal_mode = WAL');
23
+ db.exec(`CREATE TABLE episodes (
24
+ id INTEGER PRIMARY KEY,
25
+ kind TEXT, status TEXT, project TEXT,
26
+ summary TEXT, body TEXT, source TEXT,
27
+ created_at TEXT
28
+ )`);
29
+ db.close();
30
+ fs_1.default.writeFileSync(telemetryPath, [
31
+ JSON.stringify({ ts: '2026-05-15T10:00:00Z', skill: 's1', script: 'x', ok: false, exit_code: 1, output: 'Error: boom' }),
32
+ JSON.stringify({ ts: '2026-05-15T10:01:00Z', skill: 's1', script: 'x', ok: false, exit_code: 1, output: 'Error: boom again' }),
33
+ JSON.stringify({ ts: '2026-05-15T10:02:00Z', skill: 's1', script: 'x', ok: false, exit_code: 1, output: 'Error: third time' }),
34
+ ].join('\n') + '\n');
35
+ });
36
+ afterEach(() => { fs_1.default.rmSync(tmpHome, { recursive: true, force: true }); });
37
+ test('reflect-failure-scan inserts skill_failure episodes for matched failures', () => {
38
+ const script = path_1.default.join(__dirname, '..', 'dist', 'scripts', 'reflect-failure-scan.js');
39
+ const r = (0, child_process_1.spawnSync)('node', [script], {
40
+ env: { ...process.env, HOME: tmpHome, USERPROFILE: tmpHome, MINDLORE_HOME: mindloreDir },
41
+ encoding: 'utf8',
42
+ });
43
+ expect(r.status).toBe(0);
44
+ const db = new better_sqlite3_1.default(dbPath, { readonly: true });
45
+ const rows = db.prepare("SELECT * FROM episodes WHERE kind = 'skill_failure'").all();
46
+ db.close();
47
+ expect(rows.length).toBe(3);
48
+ });
49
+ //# sourceMappingURL=reflect-failure-scan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflect-failure-scan.test.js","sourceRoot":"","sources":["../../tests/reflect-failure-scan.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reflect-trigger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflect-trigger.test.d.ts","sourceRoot":"","sources":["../../tests/reflect-trigger.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const { shouldNudgeReflect } = require('../hooks/lib/reflect-trigger.cjs');
4
+ const now = new Date('2026-05-15T12:00:00Z');
5
+ const daysAgo = (n) => new Date(now.getTime() - n * 86400000).toISOString();
6
+ const hoursAgo = (n) => new Date(now.getTime() - n * 3600000).toISOString();
7
+ test('returns true when both lastReflect and lastNudge are null', () => {
8
+ expect(shouldNudgeReflect(null, null, now)).toBe(true);
9
+ });
10
+ test('returns true when lastReflect 8 days ago and no nudge yet', () => {
11
+ expect(shouldNudgeReflect(daysAgo(8), null, now)).toBe(true);
12
+ });
13
+ test('returns false when lastReflect 8 days ago but nudge was 2h ago (cooldown)', () => {
14
+ expect(shouldNudgeReflect(daysAgo(8), hoursAgo(2), now)).toBe(false);
15
+ });
16
+ test('returns true when lastReflect 8 days ago and nudge was 25h ago (cooldown expired)', () => {
17
+ expect(shouldNudgeReflect(daysAgo(8), hoursAgo(25), now)).toBe(true);
18
+ });
19
+ test('returns false when lastReflect 5 days ago (threshold not met)', () => {
20
+ expect(shouldNudgeReflect(daysAgo(5), null, now)).toBe(false);
21
+ });
22
+ test('returns true exactly at 7 days reflect threshold', () => {
23
+ expect(shouldNudgeReflect(daysAgo(7), null, now)).toBe(true);
24
+ });
25
+ test('returns false for invalid reflect date string', () => {
26
+ expect(shouldNudgeReflect('not-a-date', null, now)).toBe(false);
27
+ });
28
+ test('handles invalid nudge date gracefully (ignored, falls through to reflect check)', () => {
29
+ expect(shouldNudgeReflect(daysAgo(8), 'invalid', now)).toBe(true);
30
+ });
31
+ //# sourceMappingURL=reflect-trigger.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflect-trigger.test.js","sourceRoot":"","sources":["../../tests/reflect-trigger.test.ts"],"names":[],"mappings":";;AAAA,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;AAE3E,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAC7C,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;AACpF,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAEpF,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACrE,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACrE,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACrF,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mFAAmF,EAAE,GAAG,EAAE;IAC7F,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACzE,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC5D,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iFAAiF,EAAE,GAAG,EAAE;IAC3F,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-focus-episode-counter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-focus-episode-counter.test.d.ts","sourceRoot":"","sources":["../../tests/session-focus-episode-counter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
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 path_1 = __importDefault(require("path"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
10
+ const tmpDb = path_1.default.join(os_1.default.tmpdir(), `episode-counter-${Date.now()}.db`);
11
+ beforeAll(() => {
12
+ const db = new better_sqlite3_1.default(tmpDb);
13
+ db.exec(`CREATE TABLE episodes (
14
+ id INTEGER PRIMARY KEY,
15
+ kind TEXT,
16
+ consolidation_status TEXT,
17
+ project TEXT
18
+ )`);
19
+ const ins = db.prepare("INSERT INTO episodes(kind, consolidation_status, project) VALUES (?, ?, 'mindlore')");
20
+ for (let i = 0; i < 5; i++)
21
+ ins.run('session', 'raw');
22
+ for (let i = 0; i < 3; i++)
23
+ ins.run('learning', 'raw');
24
+ for (let i = 0; i < 2; i++)
25
+ ins.run('learning', 'consolidated');
26
+ db.close();
27
+ });
28
+ afterAll(() => { if (fs_1.default.existsSync(tmpDb))
29
+ fs_1.default.unlinkSync(tmpDb); });
30
+ test('raw episode counter excludes session kinds and counts only knowledge raw', () => {
31
+ const db = new better_sqlite3_1.default(tmpDb, { readonly: true });
32
+ const row = db.prepare(`
33
+ SELECT COUNT(*) AS c FROM episodes
34
+ WHERE (consolidation_status = 'raw' OR consolidation_status IS NULL)
35
+ AND kind IN ('learning','discovery','friction','decision','nomination')
36
+ AND project = ?
37
+ `).get('mindlore');
38
+ db.close();
39
+ expect(row).toEqual({ c: 3 });
40
+ });
41
+ //# sourceMappingURL=session-focus-episode-counter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-focus-episode-counter.test.js","sourceRoot":"","sources":["../../tests/session-focus-episode-counter.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AACpB,oEAAsC;AAEtC,MAAM,KAAK,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAEzE,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC;;;;;IAKN,CAAC,CAAC;IACJ,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,qFAAqF,CAAC,CAAC;IAC9G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAChE,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI,YAAE,CAAC,UAAU,CAAC,KAAK,CAAC;IAAE,YAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpE,IAAI,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACpF,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAKtB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACnB,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-focus-learnings-inject.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-focus-learnings-inject.test.d.ts","sourceRoot":"","sources":["../../tests/session-focus-learnings-inject.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
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 path_1 = __importDefault(require("path"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const child_process_1 = require("child_process");
10
+ let tmpHome;
11
+ let mindloreDir;
12
+ beforeAll(() => {
13
+ tmpHome = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-learnings-'));
14
+ mindloreDir = path_1.default.join(tmpHome, '.mindlore');
15
+ fs_1.default.mkdirSync(path_1.default.join(mindloreDir, 'learnings'), { recursive: true });
16
+ fs_1.default.writeFileSync(path_1.default.join(mindloreDir, 'learnings', 'sample.md'), '---\nproject: global\n---\n\n## Sample Rule\n- Always do X\n- Never do Y');
17
+ });
18
+ afterAll(() => { fs_1.default.rmSync(tmpHome, { recursive: true, force: true }); });
19
+ test('session-focus injects [Mindlore Learnings] when lessons exist', () => {
20
+ const hook = path_1.default.join(__dirname, '..', 'hooks', 'mindlore-session-focus.cjs');
21
+ const r = (0, child_process_1.spawnSync)('node', [hook], {
22
+ env: { ...process.env, HOME: tmpHome, USERPROFILE: tmpHome, MINDLORE_HOME: mindloreDir },
23
+ encoding: 'utf8',
24
+ cwd: path_1.default.join(__dirname, '..'),
25
+ });
26
+ expect(r.stdout).toContain('[Mindlore Learnings]');
27
+ expect(r.stdout).toContain('## Sample Rule');
28
+ });
29
+ //# sourceMappingURL=session-focus-learnings-inject.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-focus-learnings-inject.test.js","sourceRoot":"","sources":["../../tests/session-focus-learnings-inject.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AACpB,iDAA0C;AAE1C,IAAI,OAAe,CAAC;AACpB,IAAI,WAAmB,CAAC;AAExB,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACxE,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9C,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,EAChD,0EAA0E,CAC3E,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,GAAG,EAAE,GAAG,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1E,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACzE,MAAM,IAAI,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,CAAC,CAAC;IAC/E,MAAM,CAAC,GAAG,IAAA,yBAAS,EAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAClC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE;QACxF,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;KAChC,CAAC,CAAC;IACH,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACnD,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-focus-nomination-inject.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-focus-nomination-inject.test.d.ts","sourceRoot":"","sources":["../../tests/session-focus-nomination-inject.test.ts"],"names":[],"mappings":""}