mindlore 0.7.1 → 0.7.3

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 (117) hide show
  1. package/.claude-plugin/marketplace.json +33 -0
  2. package/.claude-plugin/plugin.json +30 -0
  3. package/dist/scripts/bundle-hooks.js +3 -1
  4. package/dist/scripts/bundle-hooks.js.map +1 -1
  5. package/dist/scripts/init.js +164 -151
  6. package/dist/scripts/init.js.map +1 -1
  7. package/dist/scripts/lib/all-migrations.d.ts.map +1 -1
  8. package/dist/scripts/lib/all-migrations.js +3 -0
  9. package/dist/scripts/lib/all-migrations.js.map +1 -1
  10. package/dist/scripts/lib/constants.d.ts +7 -0
  11. package/dist/scripts/lib/constants.d.ts.map +1 -1
  12. package/dist/scripts/lib/constants.js +17 -1
  13. package/dist/scripts/lib/constants.js.map +1 -1
  14. package/dist/scripts/lib/detect-plugin.d.ts +2 -0
  15. package/dist/scripts/lib/detect-plugin.d.ts.map +1 -0
  16. package/dist/scripts/lib/detect-plugin.js +14 -0
  17. package/dist/scripts/lib/detect-plugin.js.map +1 -0
  18. package/dist/scripts/lib/mcp-tools.d.ts.map +1 -1
  19. package/dist/scripts/lib/mcp-tools.js +63 -78
  20. package/dist/scripts/lib/mcp-tools.js.map +1 -1
  21. package/dist/scripts/lib/migrations-v072.d.ts +3 -0
  22. package/dist/scripts/lib/migrations-v072.d.ts.map +1 -0
  23. package/dist/scripts/lib/migrations-v072.js +25 -0
  24. package/dist/scripts/lib/migrations-v072.js.map +1 -0
  25. package/dist/scripts/lib/relation-helpers.d.ts +15 -0
  26. package/dist/scripts/lib/relation-helpers.d.ts.map +1 -0
  27. package/dist/scripts/lib/relation-helpers.js +30 -0
  28. package/dist/scripts/lib/relation-helpers.js.map +1 -0
  29. package/dist/scripts/lib/settings-cleanup.d.ts +6 -0
  30. package/dist/scripts/lib/settings-cleanup.d.ts.map +1 -0
  31. package/dist/scripts/lib/settings-cleanup.js +61 -0
  32. package/dist/scripts/lib/settings-cleanup.js.map +1 -0
  33. package/dist/scripts/lib/tool-adapters/get-adapter.d.ts +21 -0
  34. package/dist/scripts/lib/tool-adapters/get-adapter.d.ts.map +1 -0
  35. package/dist/scripts/lib/tool-adapters/get-adapter.js +51 -0
  36. package/dist/scripts/lib/tool-adapters/get-adapter.js.map +1 -0
  37. package/dist/scripts/lib/tool-adapters/relate-adapter.d.ts +34 -0
  38. package/dist/scripts/lib/tool-adapters/relate-adapter.d.ts.map +1 -0
  39. package/dist/scripts/lib/tool-adapters/relate-adapter.js +43 -0
  40. package/dist/scripts/lib/tool-adapters/relate-adapter.js.map +1 -0
  41. package/dist/scripts/lib/tool-adapters/search-adapter.d.ts +5 -0
  42. package/dist/scripts/lib/tool-adapters/search-adapter.d.ts.map +1 -1
  43. package/dist/scripts/lib/tool-adapters/search-adapter.js +37 -0
  44. package/dist/scripts/lib/tool-adapters/search-adapter.js.map +1 -1
  45. package/dist/scripts/mcp-server.js +40 -3
  46. package/dist/scripts/mcp-server.js.map +1 -1
  47. package/dist/scripts/mindlore-doctor.d.ts +1 -1
  48. package/dist/scripts/mindlore-doctor.d.ts.map +1 -1
  49. package/dist/scripts/mindlore-doctor.js +9 -35
  50. package/dist/scripts/mindlore-doctor.js.map +1 -1
  51. package/dist/scripts/uninstall.js +14 -38
  52. package/dist/scripts/uninstall.js.map +1 -1
  53. package/dist/tests/db-singleton.test.d.ts +2 -0
  54. package/dist/tests/db-singleton.test.d.ts.map +1 -0
  55. package/dist/tests/db-singleton.test.js +22 -0
  56. package/dist/tests/db-singleton.test.js.map +1 -0
  57. package/dist/tests/doctor.test.js +6 -15
  58. package/dist/tests/doctor.test.js.map +1 -1
  59. package/dist/tests/dont-repeat-dedup.test.d.ts +2 -0
  60. package/dist/tests/dont-repeat-dedup.test.d.ts.map +1 -0
  61. package/dist/tests/dont-repeat-dedup.test.js +93 -0
  62. package/dist/tests/dont-repeat-dedup.test.js.map +1 -0
  63. package/dist/tests/e2e-kg-pipeline.test.d.ts +2 -0
  64. package/dist/tests/e2e-kg-pipeline.test.d.ts.map +1 -0
  65. package/dist/tests/e2e-kg-pipeline.test.js +59 -0
  66. package/dist/tests/e2e-kg-pipeline.test.js.map +1 -0
  67. package/dist/tests/helpers/db.d.ts.map +1 -1
  68. package/dist/tests/helpers/db.js +2 -1
  69. package/dist/tests/helpers/db.js.map +1 -1
  70. package/dist/tests/install-matrix.test.d.ts +2 -0
  71. package/dist/tests/install-matrix.test.d.ts.map +1 -0
  72. package/dist/tests/install-matrix.test.js +110 -0
  73. package/dist/tests/install-matrix.test.js.map +1 -0
  74. package/dist/tests/mcp-get-tool.test.d.ts +2 -0
  75. package/dist/tests/mcp-get-tool.test.d.ts.map +1 -0
  76. package/dist/tests/mcp-get-tool.test.js +93 -0
  77. package/dist/tests/mcp-get-tool.test.js.map +1 -0
  78. package/dist/tests/mcp-relate-tool.test.d.ts +2 -0
  79. package/dist/tests/mcp-relate-tool.test.d.ts.map +1 -0
  80. package/dist/tests/mcp-relate-tool.test.js +85 -0
  81. package/dist/tests/mcp-relate-tool.test.js.map +1 -0
  82. package/dist/tests/mcp-server.test.js +3 -1
  83. package/dist/tests/mcp-server.test.js.map +1 -1
  84. package/dist/tests/mcp-tools.test.js +20 -0
  85. package/dist/tests/mcp-tools.test.js.map +1 -1
  86. package/dist/tests/memory-relate.test.d.ts +2 -0
  87. package/dist/tests/memory-relate.test.d.ts.map +1 -0
  88. package/dist/tests/memory-relate.test.js +70 -0
  89. package/dist/tests/memory-relate.test.js.map +1 -0
  90. package/dist/tests/migrations-v063.test.js +1 -1
  91. package/dist/tests/migrations-v072.test.d.ts +2 -0
  92. package/dist/tests/migrations-v072.test.d.ts.map +1 -0
  93. package/dist/tests/migrations-v072.test.js +74 -0
  94. package/dist/tests/migrations-v072.test.js.map +1 -0
  95. package/dist/tests/plugin-cache-regression.test.d.ts +2 -0
  96. package/dist/tests/plugin-cache-regression.test.d.ts.map +1 -0
  97. package/dist/tests/plugin-cache-regression.test.js +19 -0
  98. package/dist/tests/plugin-cache-regression.test.js.map +1 -0
  99. package/dist/tests/settings-cleanup.test.d.ts +2 -0
  100. package/dist/tests/settings-cleanup.test.d.ts.map +1 -0
  101. package/dist/tests/settings-cleanup.test.js +126 -0
  102. package/dist/tests/settings-cleanup.test.js.map +1 -0
  103. package/dist/tests/version-sync.test.d.ts +2 -0
  104. package/dist/tests/version-sync.test.d.ts.map +1 -0
  105. package/dist/tests/version-sync.test.js +41 -0
  106. package/dist/tests/version-sync.test.js.map +1 -0
  107. package/hooks/cc-memory-bulk-sync.cjs +15 -1
  108. package/hooks/cc-session-sync.cjs +15 -1
  109. package/hooks/mindlore-dont-repeat.cjs +18 -0
  110. package/hooks/mindlore-search.cjs +15 -1
  111. package/hooks/mindlore-session-focus.cjs +35 -2
  112. package/hooks/src/mindlore-dont-repeat.cjs +21 -0
  113. package/package.json +4 -2
  114. package/plugin.json +7 -3
  115. package/skills/mindlore-decide/SKILL.md +7 -0
  116. package/skills/mindlore-log/SKILL.md +7 -0
  117. package/templates/config.json +1 -1
@@ -40,6 +40,14 @@ function createTestContext() {
40
40
  CREATE TABLE IF NOT EXISTS vocabulary (
41
41
  word TEXT PRIMARY KEY
42
42
  );
43
+ CREATE TABLE IF NOT EXISTS mindlore_relations (
44
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
45
+ source_a TEXT NOT NULL,
46
+ source_b TEXT NOT NULL,
47
+ relation_type TEXT NOT NULL CHECK(relation_type IN ('cites', 'extends', 'contradicts', 'supersedes')),
48
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
49
+ UNIQUE(source_a, source_b, relation_type)
50
+ );
43
51
  `);
44
52
  return {
45
53
  db,
@@ -85,6 +93,18 @@ describe('search adapter', () => {
85
93
  ctx.cleanup();
86
94
  }
87
95
  });
96
+ it('returns related field in search results', () => {
97
+ const ctx = createTestContext();
98
+ try {
99
+ ctx.db.prepare('INSERT INTO mindlore_fts (path, slug, description, type, category, title, content, tags, quality, date_captured, project) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)').run('/test/a.md', 'a', 'desc', 'source', 'sources', 'A', 'content A', 'tag', '5', '2026-05-04', 'mindlore');
100
+ const result = (0, search_adapter_1.handleSearch)(ctx, { query: 'content A' });
101
+ expect(result.related).toBeDefined();
102
+ expect(Array.isArray(result.related)).toBe(true);
103
+ }
104
+ finally {
105
+ ctx.cleanup();
106
+ }
107
+ });
88
108
  });
89
109
  describe('stats adapter', () => {
90
110
  it('returns basic stats', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tools.test.js","sourceRoot":"","sources":["../../tests/mcp-tools.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-tools.test.js","sourceRoot":"","sources":["../../tests/mcp-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-relate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-relate.test.d.ts","sourceRoot":"","sources":["../../tests/memory-relate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
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
+ const db_1 = require("./helpers/db");
10
+ const search_adapter_1 = require("../scripts/lib/tool-adapters/search-adapter");
11
+ const relate_adapter_1 = require("../scripts/lib/tool-adapters/relate-adapter");
12
+ describe('Memory Relate — search with related sources', () => {
13
+ let testDir;
14
+ let ctx;
15
+ beforeEach(() => {
16
+ testDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-memrel-'));
17
+ const dbPath = path_1.default.join(testDir, 'test.db');
18
+ const db = (0, db_1.createTestDbWithFullSchema)(dbPath);
19
+ (0, db_1.insertFts)(db, { path: path_1.default.join(testDir, 'sources/react.md'), slug: 'react', title: 'React Framework', content: 'React is a UI library for building user interfaces', category: 'sources', type: 'source' });
20
+ (0, db_1.insertFts)(db, { path: path_1.default.join(testDir, 'sources/vue.md'), slug: 'vue', title: 'Vue Framework', content: 'Vue is a progressive framework', category: 'sources', type: 'source' });
21
+ (0, db_1.insertFts)(db, { path: path_1.default.join(testDir, 'sources/angular.md'), slug: 'angular', title: 'Angular Framework', content: 'Angular is a platform', category: 'sources', type: 'source' });
22
+ ctx = { db, baseDir: testDir };
23
+ });
24
+ afterEach(() => {
25
+ ctx.db.close();
26
+ fs_1.default.rmSync(testDir, { recursive: true, force: true });
27
+ });
28
+ it('includes related sources in search response', () => {
29
+ (0, relate_adapter_1.handleRelate)(ctx, { action: 'add', source_a: 'react', source_b: 'vue', relation_type: 'extends' });
30
+ const result = (0, search_adapter_1.handleSearch)(ctx, { query: 'React UI library' });
31
+ expect(result.related).toBeDefined();
32
+ expect(result.related.length).toBeGreaterThan(0);
33
+ expect(result.related[0].source).toBe('vue');
34
+ expect(result.related[0].via).toBe('react');
35
+ });
36
+ it('deduplicates related sources that appear in results', () => {
37
+ (0, relate_adapter_1.handleRelate)(ctx, { action: 'add', source_a: 'react', source_b: 'vue', relation_type: 'extends' });
38
+ const result = (0, search_adapter_1.handleSearch)(ctx, { query: 'framework' });
39
+ const resultSlugs = new Set(result.results.map(r => r.slug));
40
+ for (const rel of result.related) {
41
+ expect(resultSlugs.has(rel.source)).toBe(false);
42
+ }
43
+ });
44
+ it('sorts related by priority (supersedes > contradicts > extends > cites)', () => {
45
+ (0, relate_adapter_1.handleRelate)(ctx, { action: 'add', source_a: 'react', source_b: 'vue', relation_type: 'cites' });
46
+ (0, relate_adapter_1.handleRelate)(ctx, { action: 'add', source_a: 'react', source_b: 'angular', relation_type: 'supersedes' });
47
+ const result = (0, search_adapter_1.handleSearch)(ctx, { query: 'React UI library' });
48
+ expect(result.related.length).toBeGreaterThanOrEqual(2);
49
+ const types = result.related.map(r => r.relation_type);
50
+ const supersIdx = types.indexOf('supersedes');
51
+ const citesIdx = types.indexOf('cites');
52
+ if (supersIdx !== -1 && citesIdx !== -1) {
53
+ expect(supersIdx).toBeLessThan(citesIdx);
54
+ }
55
+ });
56
+ it('returns max 5 related sources', () => {
57
+ for (let i = 0; i < 8; i++) {
58
+ const slug = `extra-${i}`;
59
+ (0, db_1.insertFts)(ctx.db, { path: path_1.default.join(testDir, `sources/${slug}.md`), slug, title: `Extra ${i}`, content: `extra content ${i}`, category: 'sources', type: 'source' });
60
+ (0, relate_adapter_1.handleRelate)(ctx, { action: 'add', source_a: 'react', source_b: slug, relation_type: 'cites' });
61
+ }
62
+ const result = (0, search_adapter_1.handleSearch)(ctx, { query: 'React UI library' });
63
+ expect(result.related.length).toBeLessThanOrEqual(5);
64
+ });
65
+ it('returns empty related when no relations exist', () => {
66
+ const result = (0, search_adapter_1.handleSearch)(ctx, { query: 'React UI library' });
67
+ expect(result.related).toEqual([]);
68
+ });
69
+ });
70
+ //# sourceMappingURL=memory-relate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-relate.test.js","sourceRoot":"","sources":["../../tests/memory-relate.test.ts"],"names":[],"mappings":"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"}
@@ -68,7 +68,7 @@ describe('v0.6.3 migrations', () => {
68
68
  const dir = makeTmpDir();
69
69
  const db = (0, db_js_1.createTestDbWithFullSchema)(path_1.default.join(dir, 'mindlore.db'));
70
70
  const row = db.prepare('SELECT MAX(version) as v FROM schema_versions').get();
71
- expect(row.v).toBe(19);
71
+ expect(row.v).toBe(20);
72
72
  cleanup(dir, db);
73
73
  });
74
74
  test('vocabulary table accepts inserts and dedup', () => {
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=migrations-v072.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations-v072.test.d.ts","sourceRoot":"","sources":["../../tests/migrations-v072.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
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
+ const db_1 = require("./helpers/db");
10
+ const db_helpers_js_1 = require("../scripts/lib/db-helpers.js");
11
+ describe('migrations-v072', () => {
12
+ let testDir;
13
+ let dbPath;
14
+ beforeEach(() => {
15
+ testDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-mig072-'));
16
+ dbPath = path_1.default.join(testDir, 'test.db');
17
+ });
18
+ afterEach(() => {
19
+ fs_1.default.rmSync(testDir, { recursive: true, force: true });
20
+ });
21
+ it('creates mindlore_relations table with correct schema', () => {
22
+ const db = (0, db_1.createTestDbWithFullSchema)(dbPath);
23
+ const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='mindlore_relations'").all();
24
+ expect(tables).toHaveLength(1);
25
+ const cols = (0, db_helpers_js_1.dbAll)(db, "PRAGMA table_info(mindlore_relations)");
26
+ const colNames = cols.map(c => c.name);
27
+ expect(colNames).toContain('id');
28
+ expect(colNames).toContain('source_a');
29
+ expect(colNames).toContain('source_b');
30
+ expect(colNames).toContain('relation_type');
31
+ expect(colNames).toContain('created_at');
32
+ db.close();
33
+ });
34
+ it('enforces CHECK constraint on relation_type', () => {
35
+ const db = (0, db_1.createTestDbWithFullSchema)(dbPath);
36
+ expect(() => {
37
+ db.prepare("INSERT INTO mindlore_relations (source_a, source_b, relation_type) VALUES ('a', 'b', 'invalid')").run();
38
+ }).toThrow();
39
+ db.close();
40
+ });
41
+ it('enforces UNIQUE constraint on (source_a, source_b, relation_type)', () => {
42
+ const db = (0, db_1.createTestDbWithFullSchema)(dbPath);
43
+ db.prepare("INSERT INTO mindlore_relations (source_a, source_b, relation_type) VALUES ('a', 'b', 'cites')").run();
44
+ expect(() => {
45
+ db.prepare("INSERT INTO mindlore_relations (source_a, source_b, relation_type) VALUES ('a', 'b', 'cites')").run();
46
+ }).toThrow();
47
+ db.close();
48
+ });
49
+ it('allows INSERT OR IGNORE for idempotency', () => {
50
+ const db = (0, db_1.createTestDbWithFullSchema)(dbPath);
51
+ db.prepare("INSERT INTO mindlore_relations (source_a, source_b, relation_type) VALUES ('a', 'b', 'cites')").run();
52
+ const result = db.prepare("INSERT OR IGNORE INTO mindlore_relations (source_a, source_b, relation_type) VALUES ('a', 'b', 'cites')").run();
53
+ expect(result.changes).toBe(0);
54
+ db.close();
55
+ });
56
+ it('creates indexes on source_a, source_b, relation_type', () => {
57
+ const db = (0, db_1.createTestDbWithFullSchema)(dbPath);
58
+ const indexes = (0, db_helpers_js_1.dbAll)(db, "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='mindlore_relations'");
59
+ const names = indexes.map(i => i.name);
60
+ expect(names).toContain('idx_relations_source_a');
61
+ expect(names).toContain('idx_relations_source_b');
62
+ expect(names).toContain('idx_relations_type');
63
+ db.close();
64
+ });
65
+ it('is idempotent on re-run', () => {
66
+ const db = (0, db_1.createTestDbWithFullSchema)(dbPath);
67
+ db.close();
68
+ const db2 = (0, db_1.createTestDbWithFullSchema)(dbPath);
69
+ const tables = db2.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='mindlore_relations'").all();
70
+ expect(tables).toHaveLength(1);
71
+ db2.close();
72
+ });
73
+ });
74
+ //# sourceMappingURL=migrations-v072.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations-v072.test.js","sourceRoot":"","sources":["../../tests/migrations-v072.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin-cache-regression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-cache-regression.test.d.ts","sourceRoot":"","sources":["../../tests/plugin-cache-regression.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
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
+ describe('plugin cache regression', () => {
8
+ it('bundled hooks do not reference unbundled build artifacts', () => {
9
+ const hookDir = path_1.default.join(__dirname, '..', 'hooks');
10
+ const fs = require('fs');
11
+ const hookFiles = fs.readdirSync(hookDir).filter((f) => f.endsWith('.cjs'));
12
+ for (const file of hookFiles) {
13
+ const content = fs.readFileSync(path_1.default.join(hookDir, file), 'utf8');
14
+ // Bundled hooks should not require from dist/ (not shipped with plugin)
15
+ expect(content).not.toMatch(/require\(["']\.\.\/dist\//);
16
+ }
17
+ });
18
+ });
19
+ //# sourceMappingURL=plugin-cache-regression.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-cache-regression.test.js","sourceRoot":"","sources":["../../tests/plugin-cache-regression.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AAExB,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAEpF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAClE,wEAAwE;YACxE,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=settings-cleanup.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-cleanup.test.d.ts","sourceRoot":"","sources":["../../tests/settings-cleanup.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
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 os_1 = __importDefault(require("os"));
9
+ const settings_cleanup_js_1 = require("../scripts/lib/settings-cleanup.js");
10
+ const FIXTURES = path_1.default.join(__dirname, 'fixtures');
11
+ function loadFixture(name) {
12
+ const tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-test-'));
13
+ const src = path_1.default.join(FIXTURES, name);
14
+ const dest = path_1.default.join(tmpDir, 'settings.json');
15
+ fs_1.default.copyFileSync(src, dest);
16
+ return dest;
17
+ }
18
+ function readJson(filePath) {
19
+ return JSON.parse(fs_1.default.readFileSync(filePath, 'utf8'));
20
+ }
21
+ afterEach(() => {
22
+ // tmpdir cleanup handled by OS
23
+ });
24
+ describe('cleanupLegacyHooks', () => {
25
+ it('removes hooks with node_modules/mindlore/hooks/ path', () => {
26
+ const settingsPath = loadFixture('settings-with-mindlore-hooks.json');
27
+ const result = (0, settings_cleanup_js_1.cleanupLegacyHooks)(settingsPath);
28
+ expect(result.removed).toBe(4);
29
+ expect(result.backupCreated).toBe(true);
30
+ const settings = readJson(settingsPath);
31
+ /* eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test fixture shape */
32
+ const hooks = settings.hooks;
33
+ // PreToolUse should keep only bash-guard (user hook)
34
+ expect(hooks.PreToolUse).toHaveLength(1);
35
+ // SessionStart had only mindlore hook → event key removed
36
+ expect(hooks.SessionStart).toBeUndefined();
37
+ // UserPromptSubmit had only mindlore hook → event key removed
38
+ expect(hooks.UserPromptSubmit).toBeUndefined();
39
+ });
40
+ it('does nothing on clean settings.json (no mindlore hooks)', () => {
41
+ const settingsPath = loadFixture('settings-clean.json');
42
+ const result = (0, settings_cleanup_js_1.cleanupLegacyHooks)(settingsPath);
43
+ expect(result.removed).toBe(0);
44
+ expect(result.backupCreated).toBe(false);
45
+ });
46
+ it('preserves user custom hooks with mindlore- prefix but non-node_modules path', () => {
47
+ const settingsPath = loadFixture('settings-mixed-hooks.json');
48
+ const result = (0, settings_cleanup_js_1.cleanupLegacyHooks)(settingsPath);
49
+ expect(result.removed).toBe(2); // read-guard + session-end
50
+ const settings = readJson(settingsPath);
51
+ /* eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test fixture shape */
52
+ const hooks = settings.hooks;
53
+ // PreToolUse: bash-guard + user custom mindlore hook kept, node_modules one removed
54
+ expect(hooks.PreToolUse).toHaveLength(2);
55
+ // SessionEnd had only node_modules hook → removed
56
+ expect(hooks.SessionEnd).toBeUndefined();
57
+ });
58
+ it('creates backup file before modifying', () => {
59
+ const settingsPath = loadFixture('settings-with-mindlore-hooks.json');
60
+ const backupPath = settingsPath + '.mindlore-migration-backup';
61
+ (0, settings_cleanup_js_1.cleanupLegacyHooks)(settingsPath);
62
+ expect(fs_1.default.existsSync(backupPath)).toBe(true);
63
+ // Backup should be the original content
64
+ const backup = readJson(backupPath);
65
+ /* eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test fixture shape */
66
+ const hooks = backup.hooks;
67
+ expect(hooks.PreToolUse).toHaveLength(3);
68
+ });
69
+ it('does not overwrite existing backup', () => {
70
+ const settingsPath = loadFixture('settings-with-mindlore-hooks.json');
71
+ const backupPath = settingsPath + '.mindlore-migration-backup';
72
+ // Create fake backup first
73
+ fs_1.default.writeFileSync(backupPath, '{"fake": true}', 'utf8');
74
+ (0, settings_cleanup_js_1.cleanupLegacyHooks)(settingsPath);
75
+ // Original fake backup should be preserved
76
+ const backup = readJson(backupPath);
77
+ expect(backup.fake).toBe(true);
78
+ });
79
+ it('returns correct result when settings.json does not exist', () => {
80
+ const result = (0, settings_cleanup_js_1.cleanupLegacyHooks)('/nonexistent/path/settings.json');
81
+ expect(result.removed).toBe(0);
82
+ expect(result.backupCreated).toBe(false);
83
+ });
84
+ it('is idempotent — second run removes nothing', () => {
85
+ const settingsPath = loadFixture('settings-with-mindlore-hooks.json');
86
+ const first = (0, settings_cleanup_js_1.cleanupLegacyHooks)(settingsPath);
87
+ expect(first.removed).toBe(4);
88
+ const second = (0, settings_cleanup_js_1.cleanupLegacyHooks)(settingsPath);
89
+ expect(second.removed).toBe(0);
90
+ expect(second.backupCreated).toBe(false);
91
+ });
92
+ it('handles both forward-slash and backslash node_modules paths', () => {
93
+ const settingsPath = loadFixture('settings-with-mindlore-hooks.json');
94
+ const result = (0, settings_cleanup_js_1.cleanupLegacyHooks)(settingsPath);
95
+ // All fixtures use backslash (Windows) — verify they're caught
96
+ expect(result.removed).toBeGreaterThan(0);
97
+ });
98
+ });
99
+ describe('init.ts plugin gate verification', () => {
100
+ it('init.ts should have detectPluginInstalled gate', () => {
101
+ const initSource = fs_1.default.readFileSync(path_1.default.join(__dirname, '..', 'scripts', 'init.ts'), 'utf8');
102
+ expect(initSource).toContain('detectPluginInstalled');
103
+ });
104
+ it('init.ts should have both mergeHooks and cleanupLegacyHooks (gated)', () => {
105
+ const initSource = fs_1.default.readFileSync(path_1.default.join(__dirname, '..', 'scripts', 'init.ts'), 'utf8');
106
+ expect(initSource).toContain('mergeHooks');
107
+ expect(initSource).toContain('cleanupLegacyHooks');
108
+ });
109
+ it('init.ts should have registerSkills and registerAgents for npx-only path', () => {
110
+ const initSource = fs_1.default.readFileSync(path_1.default.join(__dirname, '..', 'scripts', 'init.ts'), 'utf8');
111
+ expect(initSource).toContain('registerSkills');
112
+ expect(initSource).toContain('registerAgents');
113
+ });
114
+ });
115
+ describe('uninstall.ts shared module usage', () => {
116
+ it('uninstall.ts should not contain inline removeHooks implementation', () => {
117
+ const uninstallSource = fs_1.default.readFileSync(path_1.default.join(__dirname, '..', 'scripts', 'uninstall.ts'), 'utf8');
118
+ // Should not have inline hook filtering logic
119
+ expect(uninstallSource).not.toContain("includes('mindlore-')");
120
+ });
121
+ it('uninstall.ts should import from settings-cleanup', () => {
122
+ const uninstallSource = fs_1.default.readFileSync(path_1.default.join(__dirname, '..', 'scripts', 'uninstall.ts'), 'utf8');
123
+ expect(uninstallSource).toContain('settings-cleanup');
124
+ });
125
+ });
126
+ //# sourceMappingURL=settings-cleanup.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-cleanup.test.js","sourceRoot":"","sources":["../../tests/settings-cleanup.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=version-sync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-sync.test.d.ts","sourceRoot":"","sources":["../../tests/version-sync.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 fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ function readJsonVersion(filePath, ...keys) {
9
+ const content = JSON.parse(fs_1.default.readFileSync(filePath, 'utf8'));
10
+ let value = content;
11
+ for (const key of keys) {
12
+ value = value[key];
13
+ }
14
+ /* eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- JSON traversal returns any */
15
+ return value;
16
+ }
17
+ describe('Version Sync', () => {
18
+ const root = path_1.default.resolve(__dirname, '..');
19
+ const versions = () => ({
20
+ packageJson: readJsonVersion(path_1.default.join(root, 'package.json'), 'version'),
21
+ pluginJson: readJsonVersion(path_1.default.join(root, 'plugin.json'), 'version'),
22
+ claudePluginJson: readJsonVersion(path_1.default.join(root, '.claude-plugin', 'plugin.json'), 'version'),
23
+ marketplaceMeta: readJsonVersion(path_1.default.join(root, '.claude-plugin', 'marketplace.json'), 'metadata', 'version'),
24
+ marketplacePlugin: readJsonVersion(path_1.default.join(root, '.claude-plugin', 'marketplace.json'), 'plugins', '0', 'version'),
25
+ });
26
+ it('all 5 version fields are equal', () => {
27
+ const v = versions();
28
+ const allVersions = Object.values(v);
29
+ const unique = new Set(allVersions);
30
+ expect(unique.size).toBe(1);
31
+ // Extra detail on failure
32
+ if (unique.size !== 1) {
33
+ console.log('Version mismatch:', v);
34
+ }
35
+ });
36
+ it('version matches semver pattern', () => {
37
+ const v = versions();
38
+ expect(v.packageJson).toMatch(/^\d+\.\d+\.\d+$/);
39
+ });
40
+ });
41
+ //# sourceMappingURL=version-sync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-sync.test.js","sourceRoot":"","sources":["../../tests/version-sync.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAExB,SAAS,eAAe,CAAC,QAAgB,EAAE,GAAG,IAAc;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,IAAI,KAAK,GAAG,OAAO,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,wGAAwG;IACxG,OAAO,KAAe,CAAC;AACzB,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,MAAM,IAAI,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;QACtB,WAAW,EAAE,eAAe,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,SAAS,CAAC;QACxE,UAAU,EAAE,eAAe,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC;QACtE,gBAAgB,EAAE,eAAe,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC;QAC9F,eAAe,EAAE,eAAe,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC;QAC9G,iBAAiB,EAAE,eAAe,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,CAAC;KACrH,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAEpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,0BAA0B;QAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -34,10 +34,11 @@ var require_constants = __commonJS({
34
34
  return mod && mod.__esModule ? mod : { "default": mod };
35
35
  };
36
36
  Object.defineProperty(exports2, "__esModule", { value: true });
37
- exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.TYPE_TO_DIR = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
37
+ exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.TYPE_TO_DIR = exports2.RELATED_OVERFETCH = exports2.MAX_RELATED_SOURCES = exports2.RELATION_PRIORITY = exports2.SYMMETRIC_TYPES = exports2.RELATION_TYPES = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
38
38
  exports2.isKnownHookEvent = isKnownHookEvent;
39
39
  exports2.isSessionCategory = isSessionCategory;
40
40
  exports2.fixVersionTokens = fixVersionTokens;
41
+ exports2.buildPriorityCase = buildPriorityCase;
41
42
  exports2.homedir = homedir;
42
43
  exports2.getActiveMindloreDir = getActiveMindloreDir;
43
44
  exports2.getAllDbs = getAllDbs;
@@ -325,6 +326,19 @@ var require_constants = __commonJS({
325
326
  "cc-session": "low",
326
327
  "cc-subagent": "low"
327
328
  };
329
+ exports2.RELATION_TYPES = ["cites", "extends", "contradicts", "supersedes"];
330
+ exports2.SYMMETRIC_TYPES = /* @__PURE__ */ new Set(["contradicts"]);
331
+ exports2.RELATION_PRIORITY = {
332
+ supersedes: 1,
333
+ contradicts: 2,
334
+ extends: 3,
335
+ cites: 4
336
+ };
337
+ exports2.MAX_RELATED_SOURCES = 5;
338
+ exports2.RELATED_OVERFETCH = 10;
339
+ function buildPriorityCase() {
340
+ return Object.entries(exports2.RELATION_PRIORITY).map(([type, priority]) => `WHEN '${type}' THEN ${priority}`).join(" ");
341
+ }
328
342
  exports2.TYPE_TO_DIR = {
329
343
  raw: "raw",
330
344
  source: "sources",
@@ -34,10 +34,11 @@ var require_constants = __commonJS({
34
34
  return mod && mod.__esModule ? mod : { "default": mod };
35
35
  };
36
36
  Object.defineProperty(exports2, "__esModule", { value: true });
37
- exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.TYPE_TO_DIR = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
37
+ exports2.CONSOLIDATION_THRESHOLD = exports2.STALE_THRESHOLD = exports2.DECAY_HALF_LIFE_DAYS = exports2.DEFAULT_TOKEN_BUDGET = exports2.CC_MEMORY_BOOST = exports2.CC_SUBAGENT_CATEGORY = exports2.CC_SESSION_CATEGORY = exports2.CC_MEMORY_CATEGORY = exports2.CC_MEMORY_DIR = exports2.CC_MEMORY_PATH_MARKER = exports2.TYPE_TO_DIR = exports2.RELATED_OVERFETCH = exports2.MAX_RELATED_SOURCES = exports2.RELATION_PRIORITY = exports2.SYMMETRIC_TYPES = exports2.RELATION_TYPES = exports2.QUALITY_HEURISTICS = exports2.QUALITY_VALUES = exports2.FRONTMATTER_TYPES = exports2.FTS5_COLUMNS = exports2.STOP_WORDS = exports2.TURKISH_WORD_RE = exports2.STOP_WORDS_MIN_LENGTH = exports2.SESSION_CATEGORIES = exports2.CATEGORIES = exports2.SCHEMA_VERSION = exports2.DEFAULT_MODELS = exports2.CONFIG_FILE = exports2.MCP_BUSY_TIMEOUT_MS = exports2.DB_BUSY_TIMEOUT_MS = exports2.SKIP_FILES = exports2.DIRECTORIES = exports2.DB_NAME = exports2.GLOBAL_MINDLORE_DIR = exports2.MINDLORE_DIR = exports2.KNOWN_HOOK_EVENTS = void 0;
38
38
  exports2.isKnownHookEvent = isKnownHookEvent;
39
39
  exports2.isSessionCategory = isSessionCategory;
40
40
  exports2.fixVersionTokens = fixVersionTokens;
41
+ exports2.buildPriorityCase = buildPriorityCase;
41
42
  exports2.homedir = homedir;
42
43
  exports2.getActiveMindloreDir = getActiveMindloreDir;
43
44
  exports2.getAllDbs = getAllDbs;
@@ -325,6 +326,19 @@ var require_constants = __commonJS({
325
326
  "cc-session": "low",
326
327
  "cc-subagent": "low"
327
328
  };
329
+ exports2.RELATION_TYPES = ["cites", "extends", "contradicts", "supersedes"];
330
+ exports2.SYMMETRIC_TYPES = /* @__PURE__ */ new Set(["contradicts"]);
331
+ exports2.RELATION_PRIORITY = {
332
+ supersedes: 1,
333
+ contradicts: 2,
334
+ extends: 3,
335
+ cites: 4
336
+ };
337
+ exports2.MAX_RELATED_SOURCES = 5;
338
+ exports2.RELATED_OVERFETCH = 10;
339
+ function buildPriorityCase() {
340
+ return Object.entries(exports2.RELATION_PRIORITY).map(([type, priority]) => `WHEN '${type}' THEN ${priority}`).join(" ");
341
+ }
328
342
  exports2.TYPE_TO_DIR = {
329
343
  raw: "raw",
330
344
  source: "sources",
@@ -74,6 +74,23 @@ function extractNegativePatterns(content) {
74
74
  }
75
75
  return patterns;
76
76
  }
77
+ var _lessonsEnforcementCached = null;
78
+ function hasLessonsEnforcementHook() {
79
+ if (_lessonsEnforcementCached !== null) return _lessonsEnforcementCached;
80
+ try {
81
+ const settingsPath = path.join(os.homedir(), ".claude", "settings.json");
82
+ const settings = JSON.parse(fs.readFileSync(settingsPath, "utf8"));
83
+ const hooks = settings.hooks || {};
84
+ const preToolUse = hooks.PreToolUse || [];
85
+ _lessonsEnforcementCached = preToolUse.some((entry) => {
86
+ const cmds = (entry.hooks || []).map((h) => h.command || "").concat(entry.command || "");
87
+ return cmds.some((c) => c.includes("lessons-enforcement"));
88
+ });
89
+ } catch (_err) {
90
+ _lessonsEnforcementCached = false;
91
+ }
92
+ return _lessonsEnforcementCached;
93
+ }
77
94
  function checkContent(content, patterns) {
78
95
  const matches = [];
79
96
  for (const p of patterns) {
@@ -117,6 +134,7 @@ function main() {
117
134
  toolInput.new_string || ""
118
135
  ].join("\n");
119
136
  if (allContent.trim().length < 10) return process.exit(0);
137
+ if (hasLessonsEnforcementHook()) return process.exit(0);
120
138
  const mindloreDir = findMindloreDir();
121
139
  const cachePath = mindloreDir ? path.join(mindloreDir, "diary", `_pattern-cache-${getProjectName()}.json`) : null;
122
140
  const cache = readCache(cachePath);