mindlore 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -11
- package/SCHEMA.md +15 -2
- package/dist/scripts/init.d.ts +1 -1
- package/dist/scripts/init.js +133 -68
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/constants.d.ts +34 -0
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +95 -1
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/schemas.d.ts +93 -0
- package/dist/scripts/lib/schemas.d.ts.map +1 -0
- package/dist/scripts/lib/schemas.js +108 -0
- package/dist/scripts/lib/schemas.js.map +1 -0
- package/dist/scripts/mindlore-fts5-index.js +3 -4
- package/dist/scripts/mindlore-fts5-index.js.map +1 -1
- package/dist/scripts/mindlore-fts5-search.d.ts +1 -1
- package/dist/scripts/mindlore-fts5-search.js +87 -74
- package/dist/scripts/mindlore-fts5-search.js.map +1 -1
- package/dist/scripts/quality-populate.d.ts +11 -0
- package/dist/scripts/quality-populate.d.ts.map +1 -0
- package/dist/scripts/quality-populate.js +86 -0
- package/dist/scripts/quality-populate.js.map +1 -0
- package/dist/scripts/uninstall.d.ts +1 -1
- package/dist/scripts/uninstall.js +27 -17
- package/dist/scripts/uninstall.js.map +1 -1
- package/dist/tests/compounding.test.js +2 -2
- package/dist/tests/compounding.test.js.map +1 -1
- package/dist/tests/cwd-changed.test.d.ts +2 -0
- package/dist/tests/cwd-changed.test.d.ts.map +1 -0
- package/dist/tests/cwd-changed.test.js +62 -0
- package/dist/tests/cwd-changed.test.js.map +1 -0
- package/dist/tests/dedup.test.js +4 -4
- package/dist/tests/dedup.test.js.map +1 -1
- package/dist/tests/dont-repeat.test.d.ts +2 -0
- package/dist/tests/dont-repeat.test.d.ts.map +1 -0
- package/dist/tests/dont-repeat.test.js +100 -0
- package/dist/tests/dont-repeat.test.js.map +1 -0
- package/dist/tests/e2e-pipeline.test.d.ts +2 -0
- package/dist/tests/e2e-pipeline.test.d.ts.map +1 -0
- package/dist/tests/e2e-pipeline.test.js +220 -0
- package/dist/tests/e2e-pipeline.test.js.map +1 -0
- package/dist/tests/evolve.test.d.ts +2 -0
- package/dist/tests/evolve.test.d.ts.map +1 -0
- package/dist/tests/evolve.test.js +105 -0
- package/dist/tests/evolve.test.js.map +1 -0
- package/dist/tests/explore.test.d.ts +2 -0
- package/dist/tests/explore.test.d.ts.map +1 -0
- package/dist/tests/explore.test.js +146 -0
- package/dist/tests/explore.test.js.map +1 -0
- package/dist/tests/fts5.test.js +7 -7
- package/dist/tests/fts5.test.js.map +1 -1
- package/dist/tests/global-layer.test.d.ts +2 -0
- package/dist/tests/global-layer.test.d.ts.map +1 -0
- package/dist/tests/global-layer.test.js +152 -0
- package/dist/tests/global-layer.test.js.map +1 -0
- package/dist/tests/helpers/db.d.ts +14 -1
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js +3 -3
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/hook-smoke.test.js +2 -2
- package/dist/tests/hook-smoke.test.js.map +1 -1
- package/dist/tests/init.test.js +83 -0
- package/dist/tests/init.test.js.map +1 -1
- package/dist/tests/model-router.test.d.ts +2 -0
- package/dist/tests/model-router.test.d.ts.map +1 -0
- package/dist/tests/model-router.test.js +146 -0
- package/dist/tests/model-router.test.js.map +1 -0
- package/dist/tests/post-read.test.d.ts +2 -0
- package/dist/tests/post-read.test.d.ts.map +1 -0
- package/dist/tests/post-read.test.js +69 -0
- package/dist/tests/post-read.test.js.map +1 -0
- package/dist/tests/quality-populate.test.d.ts +2 -0
- package/dist/tests/quality-populate.test.d.ts.map +1 -0
- package/dist/tests/quality-populate.test.js +158 -0
- package/dist/tests/quality-populate.test.js.map +1 -0
- package/dist/tests/reflect.test.d.ts +2 -0
- package/dist/tests/reflect.test.d.ts.map +1 -0
- package/dist/tests/reflect.test.js +122 -0
- package/dist/tests/reflect.test.js.map +1 -0
- package/dist/tests/schemas.test.d.ts +2 -0
- package/dist/tests/schemas.test.d.ts.map +1 -0
- package/dist/tests/schemas.test.js +87 -0
- package/dist/tests/schemas.test.js.map +1 -0
- package/dist/tests/search-hook.test.js +3 -3
- package/dist/tests/search-hook.test.js.map +1 -1
- package/dist/tests/upgrade.test.d.ts +2 -0
- package/dist/tests/upgrade.test.d.ts.map +1 -0
- package/dist/tests/upgrade.test.js +91 -0
- package/dist/tests/upgrade.test.js.map +1 -0
- package/hooks/lib/mindlore-common.cjs +89 -5
- package/hooks/lib/types.d.ts +56 -0
- package/hooks/mindlore-cwd-changed.cjs +57 -0
- package/hooks/mindlore-dont-repeat.cjs +222 -0
- package/hooks/mindlore-fts5-sync.cjs +6 -9
- package/hooks/mindlore-index.cjs +3 -3
- package/hooks/mindlore-model-router.cjs +54 -0
- package/hooks/mindlore-post-read.cjs +97 -0
- package/hooks/mindlore-read-guard.cjs +27 -4
- package/hooks/mindlore-search.cjs +73 -52
- package/hooks/mindlore-session-end.cjs +43 -1
- package/hooks/mindlore-session-focus.cjs +14 -0
- package/package.json +5 -3
- package/plugin.json +29 -1
- package/skills/mindlore-decide/SKILL.md +8 -0
- package/skills/mindlore-evolve/SKILL.md +99 -0
- package/skills/mindlore-explore/SKILL.md +104 -0
- package/skills/mindlore-health/SKILL.md +8 -0
- package/skills/mindlore-ingest/SKILL.md +65 -32
- package/skills/mindlore-log/SKILL.md +30 -13
- package/skills/mindlore-query/SKILL.md +8 -0
- package/templates/SCHEMA.md +15 -2
- package/templates/config.json +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-populate.d.ts","sourceRoot":"","sources":["../../scripts/quality-populate.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* mindlore quality-populate — Bulk-assign quality to sources with null/missing quality.
|
|
5
|
+
*
|
|
6
|
+
* Usage: node dist/scripts/quality-populate.js [--global]
|
|
7
|
+
*
|
|
8
|
+
* Scans .mindlore/sources/ for files with missing quality in frontmatter,
|
|
9
|
+
* assigns quality based on source_type heuristic, updates frontmatter + FTS5.
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const fs_1 = __importDefault(require("fs"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const constants_js_1 = require("./lib/constants.js");
|
|
18
|
+
const { parseFrontmatter, openDatabase } = require((0, constants_js_1.resolveHookCommon)(__dirname));
|
|
19
|
+
function resolveQuality(meta) {
|
|
20
|
+
const sourceType = String(meta.source_type || '').toLowerCase();
|
|
21
|
+
if (sourceType && constants_js_1.QUALITY_HEURISTICS[sourceType]) {
|
|
22
|
+
return constants_js_1.QUALITY_HEURISTICS[sourceType];
|
|
23
|
+
}
|
|
24
|
+
// URL-based fallback when source_type is missing
|
|
25
|
+
const url = String(meta.source_url || '');
|
|
26
|
+
if (url.includes('github.com'))
|
|
27
|
+
return 'high';
|
|
28
|
+
if (url.includes('docs.') || url.includes('developer.'))
|
|
29
|
+
return 'high';
|
|
30
|
+
if (url.includes('youtube.com') || url.includes('youtu.be'))
|
|
31
|
+
return 'medium';
|
|
32
|
+
return 'medium';
|
|
33
|
+
}
|
|
34
|
+
function updateFrontmatter(content, meta, quality) {
|
|
35
|
+
if (meta.quality) {
|
|
36
|
+
return content.replace(/^quality:\s*.*/m, `quality: ${quality}`);
|
|
37
|
+
}
|
|
38
|
+
return content.replace(/\n---\n/, `\nquality: ${quality}\n---\n`);
|
|
39
|
+
}
|
|
40
|
+
function main() {
|
|
41
|
+
const args = process.argv.slice(2);
|
|
42
|
+
const isGlobal = args.includes('--global');
|
|
43
|
+
const baseDir = isGlobal ? constants_js_1.GLOBAL_MINDLORE_DIR : (0, constants_js_1.getActiveMindloreDir)();
|
|
44
|
+
const sourcesDir = path_1.default.join(baseDir, 'sources');
|
|
45
|
+
if (!fs_1.default.existsSync(sourcesDir)) {
|
|
46
|
+
console.log('No sources/ directory found.');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const files = fs_1.default.readdirSync(sourcesDir).filter((f) => f.endsWith('.md') && (0, constants_js_1.isContentFile)(f));
|
|
50
|
+
const dbPath = path_1.default.join(baseDir, constants_js_1.DB_NAME);
|
|
51
|
+
// Open DB once before loop
|
|
52
|
+
const db = fs_1.default.existsSync(dbPath) ? openDatabase(dbPath) : null;
|
|
53
|
+
let updated = 0;
|
|
54
|
+
let skipped = 0;
|
|
55
|
+
for (const file of files) {
|
|
56
|
+
const filePath = path_1.default.join(sourcesDir, file);
|
|
57
|
+
const content = fs_1.default.readFileSync(filePath, 'utf8');
|
|
58
|
+
const { meta } = parseFrontmatter(content);
|
|
59
|
+
// Skip if quality already set
|
|
60
|
+
if (meta.quality && meta.quality !== 'null' && meta.quality !== '') {
|
|
61
|
+
skipped++;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const quality = resolveQuality(meta);
|
|
65
|
+
const newContent = updateFrontmatter(content, meta, quality);
|
|
66
|
+
fs_1.default.writeFileSync(filePath, newContent, 'utf8');
|
|
67
|
+
// Update FTS5
|
|
68
|
+
if (db) {
|
|
69
|
+
try {
|
|
70
|
+
const row = db.prepare('SELECT rowid FROM mindlore_fts WHERE path = ?').get(filePath);
|
|
71
|
+
if (row) {
|
|
72
|
+
db.prepare('UPDATE mindlore_fts SET quality = ? WHERE rowid = ?').run(quality, row.rowid);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (_err) {
|
|
76
|
+
// FTS5 update failure is non-fatal
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
(0, constants_js_1.log)(`${file}: quality → ${quality}`);
|
|
80
|
+
updated++;
|
|
81
|
+
}
|
|
82
|
+
db?.close();
|
|
83
|
+
console.log(`\n Quality populate: ${updated} updated, ${skipped} already set (${files.length} total)`);
|
|
84
|
+
}
|
|
85
|
+
main();
|
|
86
|
+
//# sourceMappingURL=quality-populate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-populate.js","sourceRoot":"","sources":["../../scripts/quality-populate.ts"],"names":[],"mappings":";;AAEA;;;;;;;GAOG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AACxB,qDAAmJ;AAGnJ,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAA,gCAAiB,EAAC,SAAS,CAAC,CAG9E,CAAC;AAEF,SAAS,cAAc,CAAC,IAA6B;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,IAAI,UAAU,IAAI,iCAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,OAAO,iCAAkB,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IACD,iDAAiD;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAC1C,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,MAAM,CAAC;IACvE,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,IAA6B,EAAE,OAAqB;IAC9F,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,YAAY,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,OAAO,SAAS,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,IAAI;IACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,kCAAmB,CAAC,CAAC,CAAC,IAAA,mCAAoB,GAAE,CAAC;IACxE,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEjD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAA,4BAAa,EAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAO,CAAC,CAAC;IAE3C,2BAA2B;IAC3B,MAAM,EAAE,GAAG,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/D,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE3C,8BAA8B;QAC9B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;YACnE,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7D,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAE/C,cAAc;QACd,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAkC,CAAC;gBACvH,IAAI,GAAG,EAAE,CAAC;oBACR,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBACd,mCAAmC;YACrC,CAAC;QACH,CAAC;QAED,IAAA,kBAAG,EAAC,GAAG,IAAI,eAAe,OAAO,EAAE,CAAC,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,EAAE,EAAE,KAAK,EAAE,CAAC;IAEZ,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,aAAa,OAAO,iBAAiB,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;AAC1G,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* mindlore uninstall — Remove Mindlore hooks, skills, and optionally project data.
|
|
4
4
|
*
|
|
5
|
-
* Usage: npx mindlore uninstall [--all]
|
|
5
|
+
* Usage: npx mindlore uninstall [--all] [--global]
|
|
6
6
|
*
|
|
7
7
|
* --all: also remove .mindlore/ project data (without flag, only hooks + skills)
|
|
8
8
|
*/
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* mindlore uninstall — Remove Mindlore hooks, skills, and optionally project data.
|
|
5
5
|
*
|
|
6
|
-
* Usage: npx mindlore uninstall [--all]
|
|
6
|
+
* Usage: npx mindlore uninstall [--all] [--global]
|
|
7
7
|
*
|
|
8
8
|
* --all: also remove .mindlore/ project data (without flag, only hooks + skills)
|
|
9
9
|
*/
|
|
@@ -14,14 +14,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
const fs_1 = __importDefault(require("fs"));
|
|
15
15
|
const path_1 = __importDefault(require("path"));
|
|
16
16
|
const constants_js_1 = require("./lib/constants.js");
|
|
17
|
-
function log(msg) {
|
|
18
|
-
console.log(` ${msg}`);
|
|
19
|
-
}
|
|
20
17
|
// ── Remove hooks from settings.json ────────────────────────────────────
|
|
21
18
|
function removeHooks() {
|
|
22
19
|
const settingsPath = path_1.default.join((0, constants_js_1.homedir)(), '.claude', 'settings.json');
|
|
23
20
|
if (!fs_1.default.existsSync(settingsPath)) {
|
|
24
|
-
log('No settings.json found, skipping hooks');
|
|
21
|
+
(0, constants_js_1.log)('No settings.json found, skipping hooks');
|
|
25
22
|
return 0;
|
|
26
23
|
}
|
|
27
24
|
let settings;
|
|
@@ -29,7 +26,7 @@ function removeHooks() {
|
|
|
29
26
|
settings = JSON.parse(fs_1.default.readFileSync(settingsPath, 'utf8'));
|
|
30
27
|
}
|
|
31
28
|
catch (_err) {
|
|
32
|
-
log('Could not parse settings.json, skipping hooks');
|
|
29
|
+
(0, constants_js_1.log)('Could not parse settings.json, skipping hooks');
|
|
33
30
|
return 0;
|
|
34
31
|
}
|
|
35
32
|
if (!settings.hooks)
|
|
@@ -101,7 +98,7 @@ function removeFromProjectDocs() {
|
|
|
101
98
|
function removeProjectData() {
|
|
102
99
|
const mindloreDir = path_1.default.join(process.cwd(), '.mindlore');
|
|
103
100
|
if (!fs_1.default.existsSync(mindloreDir)) {
|
|
104
|
-
log('No .mindlore/ directory in current project');
|
|
101
|
+
(0, constants_js_1.log)('No .mindlore/ directory in current project');
|
|
105
102
|
return false;
|
|
106
103
|
}
|
|
107
104
|
fs_1.default.rmSync(mindloreDir, { recursive: true, force: true });
|
|
@@ -111,31 +108,44 @@ function removeProjectData() {
|
|
|
111
108
|
function main() {
|
|
112
109
|
const args = process.argv.slice(2);
|
|
113
110
|
const removeAll = args.includes('--all');
|
|
114
|
-
|
|
111
|
+
const isGlobal = args.includes('--global');
|
|
112
|
+
const scopeLabel = isGlobal ? 'global (~/.mindlore/)' : 'project (.mindlore/)';
|
|
113
|
+
console.log(`\n Mindlore — Uninstall [${scopeLabel}]\n`);
|
|
115
114
|
// Hooks
|
|
116
115
|
const hooksRemoved = removeHooks();
|
|
117
|
-
log(hooksRemoved > 0
|
|
116
|
+
(0, constants_js_1.log)(hooksRemoved > 0
|
|
118
117
|
? `Removed ${hooksRemoved} hooks from ~/.claude/settings.json`
|
|
119
118
|
: 'No hooks found');
|
|
120
119
|
// Skills
|
|
121
120
|
const skillsRemoved = removeSkills();
|
|
122
|
-
log(skillsRemoved > 0
|
|
121
|
+
(0, constants_js_1.log)(skillsRemoved > 0
|
|
123
122
|
? `Removed ${skillsRemoved} skills from ~/.claude/skills/`
|
|
124
123
|
: 'No skills found');
|
|
125
124
|
// Project doc files
|
|
126
125
|
const docsRemoved = removeFromProjectDocs();
|
|
127
|
-
log(docsRemoved
|
|
126
|
+
(0, constants_js_1.log)(docsRemoved
|
|
128
127
|
? 'Removed SCHEMA.md from project settings'
|
|
129
128
|
: 'No project doc references found');
|
|
130
|
-
//
|
|
129
|
+
// Data removal (only with --all)
|
|
131
130
|
if (removeAll) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
131
|
+
if (isGlobal) {
|
|
132
|
+
if (fs_1.default.existsSync(constants_js_1.GLOBAL_MINDLORE_DIR)) {
|
|
133
|
+
fs_1.default.rmSync(constants_js_1.GLOBAL_MINDLORE_DIR, { recursive: true, force: true });
|
|
134
|
+
(0, constants_js_1.log)('Removed ~/.mindlore/ global data');
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
(0, constants_js_1.log)('No ~/.mindlore/ directory found');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const dataRemoved = removeProjectData();
|
|
142
|
+
(0, constants_js_1.log)(dataRemoved
|
|
143
|
+
? 'Removed .mindlore/ project data'
|
|
144
|
+
: 'No .mindlore/ directory found');
|
|
145
|
+
}
|
|
136
146
|
}
|
|
137
147
|
else {
|
|
138
|
-
log('.mindlore/
|
|
148
|
+
(0, constants_js_1.log)(`${isGlobal ? '~/.mindlore/' : '.mindlore/'} data kept (use --all to remove)`);
|
|
139
149
|
}
|
|
140
150
|
console.log('\n Done! Mindlore has been uninstalled.\n');
|
|
141
151
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../scripts/uninstall.ts"],"names":[],"mappings":";;AAEA;;;;;;GAMG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../scripts/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,14 +27,14 @@ describe('Knowledge Compounding', () => {
|
|
|
27
27
|
const sourcePath = path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md');
|
|
28
28
|
const sourceContent = '---\nslug: react-hooks\ntype: source\n---\n# React Hooks\n\nUseEffect cleanup patterns.';
|
|
29
29
|
fs_1.default.writeFileSync(sourcePath, sourceContent);
|
|
30
|
-
(0, db_js_1.insertFts)(db, sourcePath, 'react-hooks', 'UseEffect cleanup patterns', 'source', 'sources', 'React Hooks', sourceContent, '', null);
|
|
30
|
+
(0, db_js_1.insertFts)(db, { path: sourcePath, slug: 'react-hooks', description: 'UseEffect cleanup patterns', type: 'source', category: 'sources', title: 'React Hooks', content: sourceContent, tags: '', quality: null });
|
|
31
31
|
db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed) VALUES (?, ?, ?)').run(sourcePath, (0, db_js_1.sha256)(sourceContent), new Date().toISOString());
|
|
32
32
|
// Step 2: Simulate query → writeback (agent creates an insight)
|
|
33
33
|
const insightPath = path_1.default.join(TEST_DIR, 'insights', 'react-cleanup.md');
|
|
34
34
|
const insightContent = '---\nslug: react-cleanup\ntype: insight\n---\n# React Cleanup Pattern\n\nAlways return cleanup function from useEffect to avoid memory leaks.';
|
|
35
35
|
fs_1.default.writeFileSync(insightPath, insightContent);
|
|
36
36
|
// Step 3: Reindex (simulates the hook)
|
|
37
|
-
(0, db_js_1.insertFts)(db, insightPath, 'react-cleanup', 'Avoid memory leaks with useEffect cleanup', 'insight', 'insights', 'React Cleanup Pattern', insightContent, '', null);
|
|
37
|
+
(0, db_js_1.insertFts)(db, { path: insightPath, slug: 'react-cleanup', description: 'Avoid memory leaks with useEffect cleanup', type: 'insight', category: 'insights', title: 'React Cleanup Pattern', content: insightContent, tags: '', quality: null });
|
|
38
38
|
db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed) VALUES (?, ?, ?)').run(insightPath, (0, db_js_1.sha256)(insightContent), new Date().toISOString());
|
|
39
39
|
// Step 4: Next query should find the writeback content
|
|
40
40
|
const results = db
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compounding.test.js","sourceRoot":"","sources":["../../tests/compounding.test.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AACxB,2CAAiG;AAEjG,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,4BAA4B,CAAC,CAAC;AAC1E,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEnD,UAAU,CAAC,GAAG,EAAE;IACd,IAAA,oBAAY,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,uBAAe,EAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAMH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACnE,MAAM,EAAE,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;QAEjC,mCAAmC;QACnC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,yFAAyF,CAAC;QAChH,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAE5C,IAAA,iBAAS,EAAC,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,4BAA4B,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"compounding.test.js","sourceRoot":"","sources":["../../tests/compounding.test.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AACxB,2CAAiG;AAEjG,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,4BAA4B,CAAC,CAAC;AAC1E,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEnD,UAAU,CAAC,GAAG,EAAE;IACd,IAAA,oBAAY,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,uBAAe,EAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAMH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACnE,MAAM,EAAE,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;QAEjC,mCAAmC;QACnC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,yFAAyF,CAAC;QAChH,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAE5C,IAAA,iBAAS,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,4BAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAChN,EAAE,CAAC,OAAO,CACR,6EAA6E,CAC9E,CAAC,GAAG,CAAC,UAAU,EAAE,IAAA,cAAM,EAAC,aAAa,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAEnE,gEAAgE;QAChE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;QACxE,MAAM,cAAc,GAClB,+IAA+I,CAAC;QAClJ,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAE9C,uCAAuC;QACvC,IAAA,iBAAS,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,2CAA2C,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/O,EAAE,CAAC,OAAO,CACR,6EAA6E,CAC9E,CAAC,GAAG,CAAC,WAAW,EAAE,IAAA,cAAM,EAAC,cAAc,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAErE,uDAAuD;QACvD,MAAM,OAAO,GAAG,EAAE;aACf,OAAO,CACN;;;iBAGS,CACV;aACA,GAAG,CAAC,sBAAsB,CAAiB,CAAC;QAE/C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzE,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwd-changed.test.d.ts","sourceRoot":"","sources":["../../tests/cwd-changed.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
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 child_process_1 = require("child_process");
|
|
9
|
+
const db_1 = require("./helpers/db");
|
|
10
|
+
const TEST_DIR = path_1.default.join(__dirname, '..', '.test-cwd-changed');
|
|
11
|
+
const FAKE_PROJECT_A = path_1.default.join(TEST_DIR, 'project-a');
|
|
12
|
+
const FAKE_PROJECT_B = path_1.default.join(TEST_DIR, 'project-b');
|
|
13
|
+
const HOOK_SCRIPT = path_1.default.resolve(__dirname, '..', 'hooks', 'mindlore-cwd-changed.cjs');
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
(0, db_1.setupTestDir)(TEST_DIR);
|
|
16
|
+
fs_1.default.mkdirSync(FAKE_PROJECT_A, { recursive: true });
|
|
17
|
+
fs_1.default.mkdirSync(FAKE_PROJECT_B, { recursive: true });
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
(0, db_1.teardownTestDir)(TEST_DIR);
|
|
21
|
+
});
|
|
22
|
+
describe('mindlore-cwd-changed hook', () => {
|
|
23
|
+
test('writes _scope.json when project .mindlore/ exists', () => {
|
|
24
|
+
// Create .mindlore/ in project A
|
|
25
|
+
const mindloreDir = path_1.default.join(FAKE_PROJECT_A, '.mindlore');
|
|
26
|
+
const diaryDir = path_1.default.join(mindloreDir, 'diary');
|
|
27
|
+
fs_1.default.mkdirSync(diaryDir, { recursive: true });
|
|
28
|
+
(0, child_process_1.execSync)(`node "${HOOK_SCRIPT}"`, {
|
|
29
|
+
cwd: FAKE_PROJECT_A,
|
|
30
|
+
stdio: 'pipe',
|
|
31
|
+
env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
|
|
32
|
+
});
|
|
33
|
+
const scopePath = path_1.default.join(diaryDir, '_scope.json');
|
|
34
|
+
expect(fs_1.default.existsSync(scopePath)).toBe(true);
|
|
35
|
+
const scope = JSON.parse(fs_1.default.readFileSync(scopePath, 'utf8'));
|
|
36
|
+
expect(scope.scope).toBe('project');
|
|
37
|
+
expect(scope.dir).toBe(mindloreDir);
|
|
38
|
+
});
|
|
39
|
+
test('outputs warning to stderr when no .mindlore/ exists', () => {
|
|
40
|
+
// Hook outputs to stderr — capture via 2>&1
|
|
41
|
+
const result = (0, child_process_1.execSync)(`node "${HOOK_SCRIPT}" 2>&1`, {
|
|
42
|
+
cwd: FAKE_PROJECT_B,
|
|
43
|
+
encoding: 'utf8',
|
|
44
|
+
env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
|
|
45
|
+
});
|
|
46
|
+
expect(result).toContain('mindlore kurulu degil');
|
|
47
|
+
});
|
|
48
|
+
test('scope.json has correct timestamp format', () => {
|
|
49
|
+
const mindloreDir = path_1.default.join(FAKE_PROJECT_A, '.mindlore');
|
|
50
|
+
const diaryDir = path_1.default.join(mindloreDir, 'diary');
|
|
51
|
+
fs_1.default.mkdirSync(diaryDir, { recursive: true });
|
|
52
|
+
(0, child_process_1.execSync)(`node "${HOOK_SCRIPT}"`, {
|
|
53
|
+
cwd: FAKE_PROJECT_A,
|
|
54
|
+
stdio: 'pipe',
|
|
55
|
+
env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
|
|
56
|
+
});
|
|
57
|
+
const scope = JSON.parse(fs_1.default.readFileSync(path_1.default.join(diaryDir, '_scope.json'), 'utf8'));
|
|
58
|
+
expect(scope.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
|
|
59
|
+
expect(scope.cwd).toBe(FAKE_PROJECT_A);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=cwd-changed.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwd-changed.test.js","sourceRoot":"","sources":["../../tests/cwd-changed.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/dedup.test.js
CHANGED
|
@@ -22,7 +22,7 @@ describe('Content-Hash Dedup', () => {
|
|
|
22
22
|
const content = '# Test\n\nSome content here.';
|
|
23
23
|
const hash = (0, db_js_1.sha256)(content);
|
|
24
24
|
const filePath = path_1.default.join(TEST_DIR, 'test.md');
|
|
25
|
-
(0, db_js_1.insertFts)(db, filePath, 'test-doc', 'Some content here', 'source', 'sources', 'Test', content, '', null);
|
|
25
|
+
(0, db_js_1.insertFts)(db, { path: filePath, slug: 'test-doc', description: 'Some content here', type: 'source', category: 'sources', title: 'Test', content, tags: '', quality: null });
|
|
26
26
|
db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed) VALUES (?, ?, ?)').run(filePath, hash, new Date().toISOString());
|
|
27
27
|
const result = db
|
|
28
28
|
.prepare('SELECT content_hash FROM file_hashes WHERE path = ?')
|
|
@@ -35,7 +35,7 @@ describe('Content-Hash Dedup', () => {
|
|
|
35
35
|
const content = '# Unchanged\n\nThis content does not change.';
|
|
36
36
|
const hash = (0, db_js_1.sha256)(content);
|
|
37
37
|
const filePath = path_1.default.join(TEST_DIR, 'unchanged.md');
|
|
38
|
-
(0, db_js_1.insertFts)(db, filePath, 'unchanged-doc', 'This content does not change', 'source', 'sources', 'Unchanged', content, '', null);
|
|
38
|
+
(0, db_js_1.insertFts)(db, { path: filePath, slug: 'unchanged-doc', description: 'This content does not change', type: 'source', category: 'sources', title: 'Unchanged', content, tags: '', quality: null });
|
|
39
39
|
db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed) VALUES (?, ?, ?)').run(filePath, hash, '2026-01-01T00:00:00Z');
|
|
40
40
|
const existing = db
|
|
41
41
|
.prepare('SELECT content_hash FROM file_hashes WHERE path = ?')
|
|
@@ -54,7 +54,7 @@ describe('Content-Hash Dedup', () => {
|
|
|
54
54
|
const modified = '# Modified\n\nSecond version with changes.';
|
|
55
55
|
const filePath = path_1.default.join(TEST_DIR, 'changing.md');
|
|
56
56
|
const originalHash = (0, db_js_1.sha256)(original);
|
|
57
|
-
(0, db_js_1.insertFts)(db, filePath, 'changing-doc', 'First version', 'source', 'sources', 'Original', original, '', null);
|
|
57
|
+
(0, db_js_1.insertFts)(db, { path: filePath, slug: 'changing-doc', description: 'First version', type: 'source', category: 'sources', title: 'Original', content: original, tags: '', quality: null });
|
|
58
58
|
db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed) VALUES (?, ?, ?)').run(filePath, originalHash, '2026-01-01T00:00:00Z');
|
|
59
59
|
const modifiedHash = (0, db_js_1.sha256)(modified);
|
|
60
60
|
const existing = db
|
|
@@ -62,7 +62,7 @@ describe('Content-Hash Dedup', () => {
|
|
|
62
62
|
.get(filePath);
|
|
63
63
|
expect(existing.content_hash).not.toBe(modifiedHash);
|
|
64
64
|
db.prepare('DELETE FROM mindlore_fts WHERE path = ?').run(filePath);
|
|
65
|
-
(0, db_js_1.insertFts)(db, filePath, 'changing-doc', 'Second version with changes', 'source', 'sources', 'Modified', modified, '', null);
|
|
65
|
+
(0, db_js_1.insertFts)(db, { path: filePath, slug: 'changing-doc', description: 'Second version with changes', type: 'source', category: 'sources', title: 'Modified', content: modified, tags: '', quality: null });
|
|
66
66
|
db.prepare('UPDATE file_hashes SET content_hash = ?, last_indexed = ? WHERE path = ?').run(modifiedHash, new Date().toISOString(), filePath);
|
|
67
67
|
const results = db
|
|
68
68
|
.prepare('SELECT path FROM mindlore_fts WHERE mindlore_fts MATCH ?')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dedup.test.js","sourceRoot":"","sources":["../../tests/dedup.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,oEAAsC;AACtC,2CAAiG;AAEjG,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,sBAAsB,CAAC,CAAC;AACpE,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEnD,UAAU,CAAC,GAAG,EAAE;IACd,IAAA,oBAAY,EAAC,QAAQ,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;IACjC,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,uBAAe,EAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,OAAO,GAAG,8BAA8B,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAA,cAAM,EAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEhD,IAAA,iBAAS,EAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"dedup.test.js","sourceRoot":"","sources":["../../tests/dedup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dont-repeat.test.d.ts","sourceRoot":"","sources":["../../tests/dont-repeat.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
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 child_process_1 = require("child_process");
|
|
9
|
+
const db_1 = require("./helpers/db");
|
|
10
|
+
const TEST_DIR = path_1.default.join(__dirname, '..', '.test-dont-repeat');
|
|
11
|
+
const HOOK_SCRIPT = path_1.default.resolve(__dirname, '..', 'hooks', 'mindlore-dont-repeat.cjs');
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
(0, db_1.setupTestDir)(TEST_DIR);
|
|
14
|
+
// Create a fake lessons file with negative rules
|
|
15
|
+
const lessonsDir = path_1.default.join(TEST_DIR, '.claude', 'lessons');
|
|
16
|
+
fs_1.default.mkdirSync(lessonsDir, { recursive: true });
|
|
17
|
+
fs_1.default.writeFileSync(path_1.default.join(lessonsDir, 'global.md'), [
|
|
18
|
+
'# Global Lessons',
|
|
19
|
+
'',
|
|
20
|
+
'- YAPMA: ESM projede `__dirname` kullanma. `fileURLToPath(import.meta.url)` kullan',
|
|
21
|
+
'- DON\'T: Use `any` type in TypeScript — use `unknown` + type guard',
|
|
22
|
+
'- NEVER: Use `console.log` for production logging',
|
|
23
|
+
].join('\n'), 'utf8');
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
(0, db_1.teardownTestDir)(TEST_DIR);
|
|
27
|
+
});
|
|
28
|
+
function runHook(stdinData) {
|
|
29
|
+
try {
|
|
30
|
+
return (0, child_process_1.execSync)(`node "${HOOK_SCRIPT}"`, {
|
|
31
|
+
input: JSON.stringify(stdinData),
|
|
32
|
+
encoding: 'utf8',
|
|
33
|
+
timeout: 5000,
|
|
34
|
+
env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
|
|
35
|
+
cwd: TEST_DIR,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
return err.stdout || '';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
describe('mindlore-dont-repeat hook', () => {
|
|
43
|
+
test('detects violation when writing code with banned pattern', () => {
|
|
44
|
+
const result = runHook({
|
|
45
|
+
tool_name: 'Write',
|
|
46
|
+
tool_input: {
|
|
47
|
+
file_path: path_1.default.join(TEST_DIR, 'test.ts'),
|
|
48
|
+
content: 'const dir = __dirname;\nconsole.log(dir);',
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
// Should output JSON with additionalContext containing violation
|
|
52
|
+
if (result.trim()) {
|
|
53
|
+
const parsed = JSON.parse(result);
|
|
54
|
+
expect(parsed.hookSpecificOutput.additionalContext).toContain('dont-repeat');
|
|
55
|
+
}
|
|
56
|
+
// If no output, patterns may not have matched (short pattern filter)
|
|
57
|
+
});
|
|
58
|
+
test('does not trigger on non-code files', () => {
|
|
59
|
+
const result = runHook({
|
|
60
|
+
tool_name: 'Write',
|
|
61
|
+
tool_input: {
|
|
62
|
+
file_path: path_1.default.join(TEST_DIR, 'README.md'),
|
|
63
|
+
content: 'const dir = __dirname;',
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
expect(result.trim()).toBe('');
|
|
67
|
+
});
|
|
68
|
+
test('does not trigger on Edit old_string (code being removed)', () => {
|
|
69
|
+
const result = runHook({
|
|
70
|
+
tool_name: 'Edit',
|
|
71
|
+
tool_input: {
|
|
72
|
+
file_path: path_1.default.join(TEST_DIR, 'test.ts'),
|
|
73
|
+
old_string: 'const dir = __dirname;',
|
|
74
|
+
new_string: 'const dir = import.meta.url;',
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
// old_string contains __dirname but should NOT trigger (it's being removed)
|
|
78
|
+
// new_string is clean
|
|
79
|
+
expect(result.trim()).toBe('');
|
|
80
|
+
});
|
|
81
|
+
test('only accepts Write and Edit tool names', () => {
|
|
82
|
+
const result = runHook({
|
|
83
|
+
tool_name: 'Read',
|
|
84
|
+
tool_input: {
|
|
85
|
+
file_path: path_1.default.join(TEST_DIR, 'test.ts'),
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
expect(result.trim()).toBe('');
|
|
89
|
+
});
|
|
90
|
+
test('exits cleanly with empty stdin', () => {
|
|
91
|
+
const result = (0, child_process_1.execSync)(`echo "{}" | node "${HOOK_SCRIPT}"`, {
|
|
92
|
+
encoding: 'utf8',
|
|
93
|
+
timeout: 5000,
|
|
94
|
+
env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
|
|
95
|
+
cwd: TEST_DIR,
|
|
96
|
+
});
|
|
97
|
+
expect(result.trim()).toBe('');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=dont-repeat.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dont-repeat.test.js","sourceRoot":"","sources":["../../tests/dont-repeat.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e-pipeline.test.d.ts","sourceRoot":"","sources":["../../tests/e2e-pipeline.test.ts"],"names":[],"mappings":""}
|