mindlore 0.6.8 → 0.6.9
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 +259 -259
- package/SCHEMA.md +292 -292
- package/dist/scripts/cc-memory-bulk-sync.d.ts.map +1 -1
- package/dist/scripts/cc-memory-bulk-sync.js +2 -1
- package/dist/scripts/cc-memory-bulk-sync.js.map +1 -1
- package/dist/scripts/cc-session-sync.d.ts.map +1 -1
- package/dist/scripts/cc-session-sync.js +6 -5
- package/dist/scripts/cc-session-sync.js.map +1 -1
- package/dist/scripts/fetch-raw.js +5 -4
- package/dist/scripts/fetch-raw.js.map +1 -1
- package/dist/scripts/init.js +12 -11
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/consolidation.js +10 -10
- package/dist/scripts/lib/constants.d.ts +2 -0
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +10 -1
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/decay.js +9 -9
- package/dist/scripts/lib/episodes.js +23 -23
- package/dist/scripts/lib/migrations-v061.js +21 -21
- package/dist/scripts/lib/migrations-v062.js +11 -11
- package/dist/scripts/lib/migrations-v063.js +14 -14
- package/dist/scripts/lib/migrations-v067.js +11 -11
- package/dist/scripts/lib/schema-version.js +6 -6
- package/dist/scripts/lib/search-cache.js +11 -11
- package/dist/scripts/lib/secure-io.d.ts +11 -0
- package/dist/scripts/lib/secure-io.d.ts.map +1 -0
- package/dist/scripts/lib/secure-io.js +26 -0
- package/dist/scripts/lib/secure-io.js.map +1 -0
- package/dist/scripts/lib/session-payload.js +7 -7
- package/dist/scripts/lib/triage.js +3 -3
- package/dist/scripts/lib/validate-manifest.d.ts +8 -0
- package/dist/scripts/lib/validate-manifest.d.ts.map +1 -0
- package/dist/scripts/lib/validate-manifest.js +80 -0
- package/dist/scripts/lib/validate-manifest.js.map +1 -0
- package/dist/scripts/mindlore-backup.js +9 -9
- package/dist/scripts/mindlore-fts5-index.js +10 -10
- package/dist/scripts/validate-manifest-cli.d.ts +2 -0
- package/dist/scripts/validate-manifest-cli.d.ts.map +1 -0
- package/dist/scripts/validate-manifest-cli.js +38 -0
- package/dist/scripts/validate-manifest-cli.js.map +1 -0
- package/dist/tests/cc-memory-sync.test.js +3 -3
- package/dist/tests/chunks-migration.test.js +1 -1
- package/dist/tests/compaction-snapshot.test.js +2 -2
- package/dist/tests/consolidation.test.js +3 -3
- package/dist/tests/decay.test.js +9 -9
- package/dist/tests/diary.test.js +4 -4
- package/dist/tests/episode-file.test.js +2 -1
- package/dist/tests/episode-file.test.js.map +1 -1
- package/dist/tests/episodes-inject.test.js +9 -9
- package/dist/tests/fetch-raw.test.js +1 -2
- package/dist/tests/fetch-raw.test.js.map +1 -1
- package/dist/tests/fts5.test.js +75 -75
- package/dist/tests/fuzzy.test.js +1 -1
- package/dist/tests/git-snapshot.test.js +3 -5
- package/dist/tests/git-snapshot.test.js.map +1 -1
- package/dist/tests/helpers/db.d.ts +1 -2
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js +18 -26
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/manifest-v2.test.d.ts +2 -0
- package/dist/tests/manifest-v2.test.d.ts.map +1 -0
- package/dist/tests/manifest-v2.test.js +74 -0
- package/dist/tests/manifest-v2.test.js.map +1 -0
- package/dist/tests/migrations-v053.test.js +16 -16
- package/dist/tests/migrations-v061.test.js +10 -10
- package/dist/tests/migrations-v063.test.js +4 -4
- package/dist/tests/migrations-v068.test.js +6 -3
- package/dist/tests/migrations-v068.test.js.map +1 -1
- package/dist/tests/nomination-counts.test.js +6 -6
- package/dist/tests/nomination-counts.test.js.map +1 -1
- package/dist/tests/pre-compact.test.js +2 -1
- package/dist/tests/pre-compact.test.js.map +1 -1
- package/dist/tests/recall-telemetry.test.js +12 -11
- package/dist/tests/recall-telemetry.test.js.map +1 -1
- package/dist/tests/rrf.test.js +3 -3
- package/dist/tests/search-engine.test.js +1 -1
- package/dist/tests/search-hook.test.js +2 -2
- package/dist/tests/search-offload.test.js +1 -1
- package/dist/tests/search-offload.test.js.map +1 -1
- package/dist/tests/secure-io.test.d.ts +2 -0
- package/dist/tests/secure-io.test.d.ts.map +1 -0
- package/dist/tests/secure-io.test.js +65 -0
- package/dist/tests/secure-io.test.js.map +1 -0
- package/dist/tests/session-payload.test.js +1 -1
- package/dist/tests/session-summary.test.js +1 -1
- package/dist/tests/similarity.test.js +1 -1
- package/dist/tests/skill-path-resolution.test.js +22 -3
- package/dist/tests/skill-path-resolution.test.js.map +1 -1
- package/dist/tests/triage.test.js +1 -1
- package/hooks/lib/constants.cjs +15 -15
- package/hooks/lib/mindlore-common.cjs +975 -974
- package/hooks/mindlore-cwd-changed.cjs +57 -57
- package/hooks/mindlore-decision-detector.cjs +54 -54
- package/hooks/mindlore-dont-repeat.cjs +222 -222
- package/hooks/mindlore-fts5-sync.cjs +98 -97
- package/hooks/mindlore-index.cjs +230 -229
- package/hooks/mindlore-model-router.cjs +54 -54
- package/hooks/mindlore-post-compact.cjs +69 -69
- package/hooks/mindlore-post-read.cjs +106 -106
- package/hooks/mindlore-pre-compact.cjs +154 -154
- package/hooks/mindlore-read-guard.cjs +105 -105
- package/hooks/mindlore-research-guard.cjs +176 -176
- package/hooks/mindlore-search.cjs +200 -200
- package/hooks/mindlore-session-end.cjs +510 -509
- package/hooks/mindlore-session-focus.cjs +256 -256
- package/package.json +76 -75
- package/plugin.json +2 -1
- package/skills/mindlore-diary/SKILL.md +85 -85
- package/skills/mindlore-evolve/SKILL.md +126 -126
- package/skills/mindlore-explore/SKILL.md +109 -109
- package/skills/mindlore-ingest/SKILL.md +195 -195
- package/skills/mindlore-maintain/SKILL.md +125 -125
- package/skills/mindlore-query/SKILL.md +151 -151
- package/skills/mindlore-reflect/SKILL.md +141 -141
- package/skills/mindlore-stats/SKILL.md +106 -106
- package/templates/INDEX.md +14 -14
- package/templates/SCHEMA.md +292 -292
- package/templates/config.json +1 -1
- package/templates/extraction/article.md +15 -15
- package/templates/extraction/changelog.md +15 -15
- package/templates/extraction/default.md +15 -15
- package/templates/extraction/docs.md +15 -15
- package/templates/extraction/github-repo.md +17 -17
|
@@ -6,17 +6,17 @@ exports.V061_MIGRATIONS = [
|
|
|
6
6
|
version: 6,
|
|
7
7
|
name: 'cleanup_project_category',
|
|
8
8
|
up: (db) => {
|
|
9
|
-
db.exec(`
|
|
10
|
-
UPDATE mindlore_fts SET project = 'unknown'
|
|
11
|
-
WHERE project LIKE '.mindlore%' OR project LIKE 'C--%'
|
|
9
|
+
db.exec(`
|
|
10
|
+
UPDATE mindlore_fts SET project = 'unknown'
|
|
11
|
+
WHERE project LIKE '.mindlore%' OR project LIKE 'C--%'
|
|
12
12
|
`);
|
|
13
|
-
db.exec(`
|
|
14
|
-
UPDATE mindlore_fts SET category = 'cc-subagent'
|
|
15
|
-
WHERE category IN ('subagent', 'cc_subagent')
|
|
13
|
+
db.exec(`
|
|
14
|
+
UPDATE mindlore_fts SET category = 'cc-subagent'
|
|
15
|
+
WHERE category IN ('subagent', 'cc_subagent')
|
|
16
16
|
`);
|
|
17
|
-
db.exec(`
|
|
18
|
-
UPDATE mindlore_fts SET category = 'cc-session'
|
|
19
|
-
WHERE category IN ('session', 'cc_session')
|
|
17
|
+
db.exec(`
|
|
18
|
+
UPDATE mindlore_fts SET category = 'cc-session'
|
|
19
|
+
WHERE category IN ('session', 'cc_session')
|
|
20
20
|
`);
|
|
21
21
|
},
|
|
22
22
|
},
|
|
@@ -24,22 +24,22 @@ exports.V061_MIGRATIONS = [
|
|
|
24
24
|
version: 7,
|
|
25
25
|
name: 'split_fts_sessions',
|
|
26
26
|
up: (db) => {
|
|
27
|
-
db.exec(`
|
|
28
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS mindlore_fts_sessions USING fts5(
|
|
29
|
-
path, slug, description, type, category, title, content, tags,
|
|
30
|
-
quality, date_captured, project
|
|
31
|
-
)
|
|
27
|
+
db.exec(`
|
|
28
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS mindlore_fts_sessions USING fts5(
|
|
29
|
+
path, slug, description, type, category, title, content, tags,
|
|
30
|
+
quality, date_captured, project
|
|
31
|
+
)
|
|
32
32
|
`);
|
|
33
33
|
db.exec('BEGIN');
|
|
34
34
|
try {
|
|
35
|
-
db.exec(`
|
|
36
|
-
INSERT INTO mindlore_fts_sessions (path, slug, description, type, category, title, content, tags, quality, date_captured, project)
|
|
37
|
-
SELECT path, slug, description, type, category, title, content, tags, quality, date_captured, project
|
|
38
|
-
FROM mindlore_fts
|
|
39
|
-
WHERE category IN ('cc-subagent', 'cc-session')
|
|
35
|
+
db.exec(`
|
|
36
|
+
INSERT INTO mindlore_fts_sessions (path, slug, description, type, category, title, content, tags, quality, date_captured, project)
|
|
37
|
+
SELECT path, slug, description, type, category, title, content, tags, quality, date_captured, project
|
|
38
|
+
FROM mindlore_fts
|
|
39
|
+
WHERE category IN ('cc-subagent', 'cc-session')
|
|
40
40
|
`);
|
|
41
|
-
db.exec(`
|
|
42
|
-
DELETE FROM mindlore_fts WHERE category IN ('cc-subagent', 'cc-session')
|
|
41
|
+
db.exec(`
|
|
42
|
+
DELETE FROM mindlore_fts WHERE category IN ('cc-subagent', 'cc-session')
|
|
43
43
|
`);
|
|
44
44
|
db.exec('COMMIT');
|
|
45
45
|
}
|
|
@@ -6,17 +6,17 @@ exports.V062_MIGRATIONS = [
|
|
|
6
6
|
version: 8,
|
|
7
7
|
name: 'raw_metadata_table',
|
|
8
8
|
up: (db) => {
|
|
9
|
-
db.exec(`
|
|
10
|
-
CREATE TABLE IF NOT EXISTS raw_metadata (
|
|
11
|
-
path TEXT PRIMARY KEY,
|
|
12
|
-
title TEXT,
|
|
13
|
-
url TEXT,
|
|
14
|
-
date_captured TEXT,
|
|
15
|
-
headings TEXT,
|
|
16
|
-
file_size INTEGER,
|
|
17
|
-
line_count INTEGER,
|
|
18
|
-
extracted_at TEXT NOT NULL
|
|
19
|
-
)
|
|
9
|
+
db.exec(`
|
|
10
|
+
CREATE TABLE IF NOT EXISTS raw_metadata (
|
|
11
|
+
path TEXT PRIMARY KEY,
|
|
12
|
+
title TEXT,
|
|
13
|
+
url TEXT,
|
|
14
|
+
date_captured TEXT,
|
|
15
|
+
headings TEXT,
|
|
16
|
+
file_size INTEGER,
|
|
17
|
+
line_count INTEGER,
|
|
18
|
+
extracted_at TEXT NOT NULL
|
|
19
|
+
)
|
|
20
20
|
`);
|
|
21
21
|
},
|
|
22
22
|
},
|
|
@@ -14,10 +14,10 @@ exports.V063_MIGRATIONS = [
|
|
|
14
14
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown
|
|
15
15
|
const porterCount = db.prepare('SELECT COUNT(*) as c FROM mindlore_fts').get().c;
|
|
16
16
|
if (porterCount > 0) {
|
|
17
|
-
db.exec(`
|
|
18
|
-
INSERT INTO mindlore_fts_trigram(path, slug, description, type, category, title, content, tags, quality, date_captured, project)
|
|
19
|
-
SELECT path, slug, description, type, category, title, content, tags, quality, date_captured, project
|
|
20
|
-
FROM mindlore_fts
|
|
17
|
+
db.exec(`
|
|
18
|
+
INSERT INTO mindlore_fts_trigram(path, slug, description, type, category, title, content, tags, quality, date_captured, project)
|
|
19
|
+
SELECT path, slug, description, type, category, title, content, tags, quality, date_captured, project
|
|
20
|
+
FROM mindlore_fts
|
|
21
21
|
`);
|
|
22
22
|
}
|
|
23
23
|
},
|
|
@@ -33,16 +33,16 @@ exports.V063_MIGRATIONS = [
|
|
|
33
33
|
version: 12,
|
|
34
34
|
name: 'chunks_table',
|
|
35
35
|
up: (db) => {
|
|
36
|
-
db.exec(`
|
|
37
|
-
CREATE TABLE IF NOT EXISTS chunks (
|
|
38
|
-
id INTEGER PRIMARY KEY,
|
|
39
|
-
source_path TEXT NOT NULL,
|
|
40
|
-
chunk_index INTEGER NOT NULL,
|
|
41
|
-
heading TEXT,
|
|
42
|
-
breadcrumb TEXT,
|
|
43
|
-
char_count INTEGER,
|
|
44
|
-
UNIQUE(source_path, chunk_index)
|
|
45
|
-
)
|
|
36
|
+
db.exec(`
|
|
37
|
+
CREATE TABLE IF NOT EXISTS chunks (
|
|
38
|
+
id INTEGER PRIMARY KEY,
|
|
39
|
+
source_path TEXT NOT NULL,
|
|
40
|
+
chunk_index INTEGER NOT NULL,
|
|
41
|
+
heading TEXT,
|
|
42
|
+
breadcrumb TEXT,
|
|
43
|
+
char_count INTEGER,
|
|
44
|
+
UNIQUE(source_path, chunk_index)
|
|
45
|
+
)
|
|
46
46
|
`);
|
|
47
47
|
},
|
|
48
48
|
},
|
|
@@ -22,18 +22,18 @@ exports.V067_MIGRATIONS = [
|
|
|
22
22
|
version: 16,
|
|
23
23
|
name: 'episode_inject_log_integer_fix',
|
|
24
24
|
up: (db) => {
|
|
25
|
-
db.exec(`
|
|
26
|
-
CREATE TABLE episode_inject_log_new (
|
|
27
|
-
session_id TEXT NOT NULL,
|
|
28
|
-
episode_id INTEGER NOT NULL,
|
|
29
|
-
injected_at TEXT NOT NULL,
|
|
30
|
-
PRIMARY KEY (session_id, episode_id)
|
|
31
|
-
)
|
|
25
|
+
db.exec(`
|
|
26
|
+
CREATE TABLE episode_inject_log_new (
|
|
27
|
+
session_id TEXT NOT NULL,
|
|
28
|
+
episode_id INTEGER NOT NULL,
|
|
29
|
+
injected_at TEXT NOT NULL,
|
|
30
|
+
PRIMARY KEY (session_id, episode_id)
|
|
31
|
+
)
|
|
32
32
|
`);
|
|
33
|
-
db.exec(`
|
|
34
|
-
INSERT INTO episode_inject_log_new (session_id, episode_id, injected_at)
|
|
35
|
-
SELECT session_id, CAST(episode_id AS INTEGER), injected_at
|
|
36
|
-
FROM episode_inject_log
|
|
33
|
+
db.exec(`
|
|
34
|
+
INSERT INTO episode_inject_log_new (session_id, episode_id, injected_at)
|
|
35
|
+
SELECT session_id, CAST(episode_id AS INTEGER), injected_at
|
|
36
|
+
FROM episode_inject_log
|
|
37
37
|
`);
|
|
38
38
|
db.exec('DROP TABLE episode_inject_log');
|
|
39
39
|
db.exec('ALTER TABLE episode_inject_log_new RENAME TO episode_inject_log');
|
|
@@ -5,12 +5,12 @@ exports.getSchemaVersion = getSchemaVersion;
|
|
|
5
5
|
exports.setSchemaVersion = setSchemaVersion;
|
|
6
6
|
exports.runMigrations = runMigrations;
|
|
7
7
|
function ensureSchemaTable(db) {
|
|
8
|
-
db.exec(`
|
|
9
|
-
CREATE TABLE IF NOT EXISTS schema_versions (
|
|
10
|
-
version INTEGER PRIMARY KEY,
|
|
11
|
-
name TEXT NOT NULL,
|
|
12
|
-
applied_at TEXT NOT NULL
|
|
13
|
-
)
|
|
8
|
+
db.exec(`
|
|
9
|
+
CREATE TABLE IF NOT EXISTS schema_versions (
|
|
10
|
+
version INTEGER PRIMARY KEY,
|
|
11
|
+
name TEXT NOT NULL,
|
|
12
|
+
applied_at TEXT NOT NULL
|
|
13
|
+
)
|
|
14
14
|
`);
|
|
15
15
|
}
|
|
16
16
|
function getSchemaVersion(db) {
|
|
@@ -23,12 +23,12 @@ class SearchCache {
|
|
|
23
23
|
ensureStatsTable() {
|
|
24
24
|
if (this.statsReady)
|
|
25
25
|
return;
|
|
26
|
-
this.db.exec(`
|
|
27
|
-
CREATE TABLE IF NOT EXISTS search_cache_stats (
|
|
28
|
-
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
29
|
-
hits INTEGER NOT NULL DEFAULT 0,
|
|
30
|
-
misses INTEGER NOT NULL DEFAULT 0
|
|
31
|
-
)
|
|
26
|
+
this.db.exec(`
|
|
27
|
+
CREATE TABLE IF NOT EXISTS search_cache_stats (
|
|
28
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
29
|
+
hits INTEGER NOT NULL DEFAULT 0,
|
|
30
|
+
misses INTEGER NOT NULL DEFAULT 0
|
|
31
|
+
)
|
|
32
32
|
`);
|
|
33
33
|
this.db.prepare('INSERT OR IGNORE INTO search_cache_stats (id, hits, misses) VALUES (1, 0, 0)').run();
|
|
34
34
|
this.stmtHit = this.db.prepare('UPDATE search_cache_stats SET hits = hits + 1 WHERE id = 1');
|
|
@@ -88,11 +88,11 @@ class SearchThrottle {
|
|
|
88
88
|
incrementCallCount(sessionId) {
|
|
89
89
|
const now = new Date().toISOString();
|
|
90
90
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown
|
|
91
|
-
const row = this.db.prepare(`
|
|
92
|
-
INSERT INTO search_throttle (session_id, call_count, last_call)
|
|
93
|
-
VALUES (?, 1, ?)
|
|
94
|
-
ON CONFLICT(session_id) DO UPDATE SET call_count = call_count + 1, last_call = ?
|
|
95
|
-
RETURNING call_count
|
|
91
|
+
const row = this.db.prepare(`
|
|
92
|
+
INSERT INTO search_throttle (session_id, call_count, last_call)
|
|
93
|
+
VALUES (?, 1, ?)
|
|
94
|
+
ON CONFLICT(session_id) DO UPDATE SET call_count = call_count + 1, last_call = ?
|
|
95
|
+
RETURNING call_count
|
|
96
96
|
`).get(sessionId, now, now);
|
|
97
97
|
return row?.call_count ?? 1;
|
|
98
98
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* R4 Convention: File I/O must happen BEFORE the DB transaction.
|
|
3
|
+
* Pre-read data into memory, then run DB writes in a single transaction.
|
|
4
|
+
* This prevents holding SQLite write locks during slow disk I/O.
|
|
5
|
+
*
|
|
6
|
+
* All secure file operations are centralized here.
|
|
7
|
+
*/
|
|
8
|
+
export declare function safeMkdir(dirPath: string): void;
|
|
9
|
+
export declare function safeWriteFile(filePath: string, data: string): void;
|
|
10
|
+
export declare function safeWriteJson(filePath: string, obj: unknown): void;
|
|
11
|
+
//# sourceMappingURL=secure-io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-io.d.ts","sourceRoot":"","sources":["../../../scripts/lib/secure-io.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAElE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAElE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* R4 Convention: File I/O must happen BEFORE the DB transaction.
|
|
4
|
+
* Pre-read data into memory, then run DB writes in a single transaction.
|
|
5
|
+
* This prevents holding SQLite write locks during slow disk I/O.
|
|
6
|
+
*
|
|
7
|
+
* All secure file operations are centralized here.
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.safeMkdir = safeMkdir;
|
|
14
|
+
exports.safeWriteFile = safeWriteFile;
|
|
15
|
+
exports.safeWriteJson = safeWriteJson;
|
|
16
|
+
const fs_1 = __importDefault(require("fs"));
|
|
17
|
+
function safeMkdir(dirPath) {
|
|
18
|
+
fs_1.default.mkdirSync(dirPath, { recursive: true, mode: 0o700 });
|
|
19
|
+
}
|
|
20
|
+
function safeWriteFile(filePath, data) {
|
|
21
|
+
fs_1.default.writeFileSync(filePath, data, { encoding: 'utf8', mode: 0o600 });
|
|
22
|
+
}
|
|
23
|
+
function safeWriteJson(filePath, obj) {
|
|
24
|
+
safeWriteFile(filePath, JSON.stringify(obj, null, 2) + '\n');
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=secure-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-io.js","sourceRoot":"","sources":["../../../scripts/lib/secure-io.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;AAIH,8BAEC;AAED,sCAEC;AAED,sCAEC;AAZD,4CAAoB;AAEpB,SAAgB,SAAS,CAAC,OAAe;IACvC,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAgB,aAAa,CAAC,QAAgB,EAAE,IAAY;IAC1D,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,SAAgB,aAAa,CAAC,QAAgB,EAAE,GAAY;IAC1D,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -36,11 +36,11 @@ function buildEpisodeSections(db, project, sessionId) {
|
|
|
36
36
|
const dedupClause = sessionId
|
|
37
37
|
? 'AND rowid NOT IN (SELECT episode_id FROM episode_inject_log WHERE session_id = ?)'
|
|
38
38
|
: '';
|
|
39
|
-
const query = `SELECT rowid, kind, summary, created_at FROM episodes
|
|
40
|
-
WHERE status = 'active' AND project = ?
|
|
41
|
-
AND kind IN ('decision', 'friction', 'learning')
|
|
42
|
-
AND created_at >= ?
|
|
43
|
-
${dedupClause}
|
|
39
|
+
const query = `SELECT rowid, kind, summary, created_at FROM episodes
|
|
40
|
+
WHERE status = 'active' AND project = ?
|
|
41
|
+
AND kind IN ('decision', 'friction', 'learning')
|
|
42
|
+
AND created_at >= ?
|
|
43
|
+
${dedupClause}
|
|
44
44
|
ORDER BY kind, created_at DESC`;
|
|
45
45
|
const params = sessionId ? [project, sevenDaysAgo, sessionId] : [project, sevenDaysAgo];
|
|
46
46
|
const rawRows = db.prepare(query).all(...params);
|
|
@@ -81,8 +81,8 @@ function buildSessionPayload(opts) {
|
|
|
81
81
|
// Session summaries from recent sessions (#9)
|
|
82
82
|
try {
|
|
83
83
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .all() returns unknown[]
|
|
84
|
-
const summaries = db.prepare(`SELECT session_summary, created_at FROM episodes
|
|
85
|
-
WHERE kind = 'session-summary' AND project = ? AND session_summary IS NOT NULL
|
|
84
|
+
const summaries = db.prepare(`SELECT session_summary, created_at FROM episodes
|
|
85
|
+
WHERE kind = 'session-summary' AND project = ? AND session_summary IS NOT NULL
|
|
86
86
|
ORDER BY created_at DESC LIMIT 3`).all(project);
|
|
87
87
|
if (summaries.length > 0) {
|
|
88
88
|
const content = summaries.map(s => `- ${s.created_at.slice(0, 16)}: ${s.session_summary}`).join('\n');
|
|
@@ -73,9 +73,9 @@ function extractRawMetadata(filePath) {
|
|
|
73
73
|
function cacheRawMetadata(db, filePath, baseDir) {
|
|
74
74
|
const meta = extractRawMetadata(filePath);
|
|
75
75
|
const relPath = path_1.default.relative(baseDir, filePath).replace(/\\/g, '/');
|
|
76
|
-
db.prepare(`
|
|
77
|
-
INSERT OR REPLACE INTO raw_metadata (path, title, url, date_captured, headings, file_size, line_count, extracted_at)
|
|
78
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
76
|
+
db.prepare(`
|
|
77
|
+
INSERT OR REPLACE INTO raw_metadata (path, title, url, date_captured, headings, file_size, line_count, extracted_at)
|
|
78
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
79
79
|
`).run(relPath, meta.title, meta.url, meta.date_captured, meta.headings, meta.file_size, meta.line_count, new Date().toISOString());
|
|
80
80
|
}
|
|
81
81
|
//# sourceMappingURL=triage.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ManifestValidationResult {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
manifestVersion: number;
|
|
4
|
+
errors: string[];
|
|
5
|
+
warnings: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function validateManifest(manifest: Record<string, unknown>): ManifestValidationResult;
|
|
8
|
+
//# sourceMappingURL=validate-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-manifest.d.ts","sourceRoot":"","sources":["../../../scripts/lib/validate-manifest.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAYD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAmE5F"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateManifest = validateManifest;
|
|
4
|
+
const constants_js_1 = require("./constants.js");
|
|
5
|
+
const SEMVER_RE = /^\d+\.\d+\.\d+$/;
|
|
6
|
+
function validateSemVer(value, label, errors) {
|
|
7
|
+
if (value !== undefined) {
|
|
8
|
+
if (typeof value !== 'string' || !SEMVER_RE.test(value)) {
|
|
9
|
+
errors.push(`${label} must be valid SemVer (x.y.z), got: ${value}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function validateManifest(manifest) {
|
|
14
|
+
const errors = [];
|
|
15
|
+
const warnings = [];
|
|
16
|
+
const mv = typeof manifest.manifestVersion === 'number' ? manifest.manifestVersion : 1;
|
|
17
|
+
if (manifest.manifestVersion !== undefined && (typeof manifest.manifestVersion !== 'number' || ![1, 2].includes(mv))) {
|
|
18
|
+
errors.push(`manifestVersion must be 1 or 2, got: ${manifest.manifestVersion}`);
|
|
19
|
+
}
|
|
20
|
+
if (!manifest.name || typeof manifest.name !== 'string') {
|
|
21
|
+
errors.push('name is required and must be a string');
|
|
22
|
+
}
|
|
23
|
+
if (!manifest.description || typeof manifest.description !== 'string') {
|
|
24
|
+
errors.push('description is required and must be a string');
|
|
25
|
+
}
|
|
26
|
+
if (mv >= 2) {
|
|
27
|
+
validateSemVer(manifest.version, 'version', errors);
|
|
28
|
+
validateSemVer(manifest.minCCVersion, 'minCCVersion', errors);
|
|
29
|
+
if (manifest.conflicts !== undefined) {
|
|
30
|
+
if (!Array.isArray(manifest.conflicts) || !manifest.conflicts.every((c) => typeof c === 'string')) {
|
|
31
|
+
errors.push('conflicts must be an array of strings');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (manifest.skills !== undefined) {
|
|
36
|
+
if (!Array.isArray(manifest.skills)) {
|
|
37
|
+
errors.push('skills must be an array');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
for (let i = 0; i < manifest.skills.length; i++) {
|
|
41
|
+
const s = manifest.skills[i];
|
|
42
|
+
if (!s || typeof s !== 'object' || Array.isArray(s)) {
|
|
43
|
+
errors.push(`skills[${i}]: must be an object`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const name = 'name' in s ? s.name : undefined;
|
|
47
|
+
const path = 'path' in s ? s.path : undefined;
|
|
48
|
+
if (!name || typeof name !== 'string')
|
|
49
|
+
errors.push(`skills[${i}]: name is required`);
|
|
50
|
+
if (!path || typeof path !== 'string')
|
|
51
|
+
errors.push(`skills[${i}]: path is required`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (manifest.hooks !== undefined) {
|
|
56
|
+
if (!Array.isArray(manifest.hooks)) {
|
|
57
|
+
errors.push('hooks must be an array');
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
for (let i = 0; i < manifest.hooks.length; i++) {
|
|
61
|
+
const h = manifest.hooks[i];
|
|
62
|
+
if (!h || typeof h !== 'object' || Array.isArray(h)) {
|
|
63
|
+
errors.push(`hooks[${i}]: must be an object`);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const event = 'event' in h ? h.event : undefined;
|
|
67
|
+
const script = 'script' in h ? h.script : undefined;
|
|
68
|
+
if (!event || typeof event !== 'string')
|
|
69
|
+
errors.push(`hooks[${i}]: event is required`);
|
|
70
|
+
if (!script || typeof script !== 'string')
|
|
71
|
+
errors.push(`hooks[${i}]: script is required`);
|
|
72
|
+
if (event && typeof event === 'string' && !(0, constants_js_1.isKnownHookEvent)(event)) {
|
|
73
|
+
warnings.push(`hooks[${i}]: unknown event "${event}"`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { valid: errors.length === 0, manifestVersion: mv, errors, warnings };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=validate-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-manifest.js","sourceRoot":"","sources":["../../../scripts/lib/validate-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,15 +23,15 @@ const BASE_DIR = constants_js_1.GLOBAL_MINDLORE_DIR;
|
|
|
23
23
|
const GIT_DIR = path_1.default.join(BASE_DIR, '.git');
|
|
24
24
|
// System files that are regenerated by init — shared definition for gitignore and export filtering
|
|
25
25
|
const SYSTEM_FILES = ['config.json', 'SCHEMA.md', '.version', '.pkg-version'];
|
|
26
|
-
const GITIGNORE_CONTENT = `# WAL files — transient
|
|
27
|
-
*.db-shm
|
|
28
|
-
*.db-wal
|
|
29
|
-
|
|
30
|
-
# System files — regenerated by init
|
|
31
|
-
${SYSTEM_FILES.join('\n')}
|
|
32
|
-
|
|
33
|
-
# Cache / temp
|
|
34
|
-
diary/_*.json
|
|
26
|
+
const GITIGNORE_CONTENT = `# WAL files — transient
|
|
27
|
+
*.db-shm
|
|
28
|
+
*.db-wal
|
|
29
|
+
|
|
30
|
+
# System files — regenerated by init
|
|
31
|
+
${SYSTEM_FILES.join('\n')}
|
|
32
|
+
|
|
33
|
+
# Cache / temp
|
|
34
|
+
diary/_*.json
|
|
35
35
|
`;
|
|
36
36
|
function backupInit() {
|
|
37
37
|
if (!fs_1.default.existsSync(BASE_DIR)) {
|
|
@@ -48,19 +48,19 @@ async function main() {
|
|
|
48
48
|
(0, schema_version_js_1.ensureSchemaTable)(db);
|
|
49
49
|
(0, schema_version_js_1.runMigrations)(db, all_migrations_js_1.FTS_DB_MIGRATIONS);
|
|
50
50
|
const projectName = path_1.default.basename(process.cwd());
|
|
51
|
-
const upsertHash = db.prepare(`
|
|
52
|
-
INSERT INTO file_hashes (path, content_hash, last_indexed, created_at, project_scope, importance)
|
|
53
|
-
VALUES (?, ?, ?, datetime('now'), ?, ?)
|
|
54
|
-
ON CONFLICT(path) DO UPDATE SET
|
|
55
|
-
content_hash = excluded.content_hash,
|
|
56
|
-
last_indexed = excluded.last_indexed,
|
|
57
|
-
updated_at = datetime('now'),
|
|
58
|
-
project_scope = excluded.project_scope,
|
|
59
|
-
importance = excluded.importance
|
|
51
|
+
const upsertHash = db.prepare(`
|
|
52
|
+
INSERT INTO file_hashes (path, content_hash, last_indexed, created_at, project_scope, importance)
|
|
53
|
+
VALUES (?, ?, ?, datetime('now'), ?, ?)
|
|
54
|
+
ON CONFLICT(path) DO UPDATE SET
|
|
55
|
+
content_hash = excluded.content_hash,
|
|
56
|
+
last_indexed = excluded.last_indexed,
|
|
57
|
+
updated_at = datetime('now'),
|
|
58
|
+
project_scope = excluded.project_scope,
|
|
59
|
+
importance = excluded.importance
|
|
60
60
|
`);
|
|
61
61
|
const deleteFts = db.prepare('DELETE FROM mindlore_fts WHERE path = ?');
|
|
62
62
|
const deleteFtsSessions = db.prepare('DELETE FROM mindlore_fts_sessions WHERE path = ?');
|
|
63
|
-
const insertFtsSessions = db.prepare(`INSERT INTO mindlore_fts_sessions (path, slug, description, type, category, title, content, tags, quality, date_captured, project)
|
|
63
|
+
const insertFtsSessions = db.prepare(`INSERT INTO mindlore_fts_sessions (path, slug, description, type, category, title, content, tags, quality, date_captured, project)
|
|
64
64
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
65
65
|
const getHash = db.prepare('SELECT content_hash, last_indexed FROM file_hashes WHERE path = ?');
|
|
66
66
|
const checkFts = db.prepare('SELECT 1 FROM mindlore_fts WHERE path = ? LIMIT 1');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-manifest-cli.d.ts","sourceRoot":"","sources":["../../scripts/validate-manifest-cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 validate_manifest_js_1 = require("./lib/validate-manifest.js");
|
|
9
|
+
const manifestPath = path_1.default.resolve(__dirname, '..', '..', 'plugin.json');
|
|
10
|
+
let manifest;
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(fs_1.default.readFileSync(manifestPath, 'utf8'));
|
|
13
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
14
|
+
console.error('plugin.json must be a JSON object');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
manifest = { ...parsed };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
21
|
+
console.error(`Failed to read/parse plugin.json: ${msg}`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const result = (0, validate_manifest_js_1.validateManifest)(manifest);
|
|
25
|
+
if (result.valid) {
|
|
26
|
+
console.log(`Manifest v${result.manifestVersion} valid`);
|
|
27
|
+
if (result.warnings.length > 0) {
|
|
28
|
+
for (const w of result.warnings)
|
|
29
|
+
console.log(` WARN: ${w}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.error('Manifest validation failed:');
|
|
34
|
+
for (const e of result.errors)
|
|
35
|
+
console.error(` ERROR: ${e}`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=validate-manifest-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-manifest-cli.js","sourceRoot":"","sources":["../../scripts/validate-manifest-cli.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,qEAA8D;AAE9D,MAAM,YAAY,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;AAExE,IAAI,QAAiC,CAAC;AACtC,IAAI,CAAC;IACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,QAAQ,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;AAC3B,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,KAAK,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAA,uCAAgB,EAAC,QAAQ,CAAC,CAAC;AAE1C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,eAAe,QAAQ,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -30,7 +30,7 @@ describe('CC Memory Sync', () => {
|
|
|
30
30
|
'',
|
|
31
31
|
'Run tests before every commit.',
|
|
32
32
|
].join('\n'));
|
|
33
|
-
const db = (0, db_js_1.
|
|
33
|
+
const db = (0, db_js_1.createTestDbWithFullSchema)(DB_PATH);
|
|
34
34
|
const { parseFrontmatter, insertFtsRow } = require('../hooks/lib/mindlore-common.cjs');
|
|
35
35
|
const content = fs_1.default.readFileSync(memFile, 'utf8');
|
|
36
36
|
const { meta } = parseFrontmatter(content);
|
|
@@ -76,7 +76,7 @@ describe('CC Memory Sync', () => {
|
|
|
76
76
|
'',
|
|
77
77
|
'Senior developer focused on security.',
|
|
78
78
|
].join('\n'));
|
|
79
|
-
const db = (0, db_js_1.
|
|
79
|
+
const db = (0, db_js_1.createTestDbWithFullSchema)(DB_PATH);
|
|
80
80
|
const copyDir = path_1.default.join(TEST_DIR, 'memory', 'test-project');
|
|
81
81
|
fs_1.default.mkdirSync(copyDir, { recursive: true });
|
|
82
82
|
const content = fs_1.default.readFileSync(memFile, 'utf8');
|
|
@@ -100,7 +100,7 @@ describe('CC Memory Sync', () => {
|
|
|
100
100
|
].join('\n');
|
|
101
101
|
fs_1.default.writeFileSync(memFile, content);
|
|
102
102
|
const hash = (0, db_js_1.sha256)(content);
|
|
103
|
-
const db = (0, db_js_1.
|
|
103
|
+
const db = (0, db_js_1.createTestDbWithFullSchema)(DB_PATH);
|
|
104
104
|
// First index: insert file_hash
|
|
105
105
|
db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed, source_type) VALUES (?, ?, ?, ?)').run(memFile, hash, new Date().toISOString(), 'cc-memory');
|
|
106
106
|
// Simulate the indexCcMemory try/finally pattern with early return on unchanged
|
|
@@ -13,7 +13,7 @@ describe('chunks table migration', () => {
|
|
|
13
13
|
let tmpDir;
|
|
14
14
|
beforeEach(() => {
|
|
15
15
|
tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-chunks-'));
|
|
16
|
-
db = (0, db_js_1.
|
|
16
|
+
db = (0, db_js_1.createTestDbWithFullSchema)(path_1.default.join(tmpDir, 'test.db'));
|
|
17
17
|
});
|
|
18
18
|
afterEach(() => {
|
|
19
19
|
db.close();
|
|
@@ -57,9 +57,9 @@ describe('compaction snapshot — hook integration', () => {
|
|
|
57
57
|
let env;
|
|
58
58
|
beforeEach(() => {
|
|
59
59
|
env = (0, db_js_1.createEpisodesTestEnv)('compact-hook');
|
|
60
|
-
env.db.prepare(`INSERT INTO episodes (kind, scope, project, summary, status, created_at)
|
|
60
|
+
env.db.prepare(`INSERT INTO episodes (kind, scope, project, summary, status, created_at)
|
|
61
61
|
VALUES ('decision', 'project', 'test', 'Use RRF fusion', 'active', datetime('now', '-1 hour'))`).run();
|
|
62
|
-
env.db.prepare(`INSERT INTO episodes (kind, scope, project, summary, status, created_at)
|
|
62
|
+
env.db.prepare(`INSERT INTO episodes (kind, scope, project, summary, status, created_at)
|
|
63
63
|
VALUES ('friction', 'project', 'test', 'Windows CRLF issue', 'active', datetime('now', '-2 hours'))`).run();
|
|
64
64
|
});
|
|
65
65
|
afterEach(() => (0, db_js_1.destroyEpisodesTestEnv)(env));
|
|
@@ -22,9 +22,9 @@ afterEach(() => {
|
|
|
22
22
|
(0, db_js_1.destroyEpisodesTestEnv)(env);
|
|
23
23
|
});
|
|
24
24
|
function insertEpisode(db, opts) {
|
|
25
|
-
db.prepare(`
|
|
26
|
-
INSERT INTO episodes (id, kind, scope, summary, status, created_at, consolidation_status)
|
|
27
|
-
VALUES (?, ?, 'project', ?, ?, ?, ?)
|
|
25
|
+
db.prepare(`
|
|
26
|
+
INSERT INTO episodes (id, kind, scope, summary, status, created_at, consolidation_status)
|
|
27
|
+
VALUES (?, ?, 'project', ?, ?, ?, ?)
|
|
28
28
|
`).run(opts.id, opts.kind, opts.summary, opts.status ?? 'active', new Date().toISOString(), opts.consolidation_status ?? 'raw');
|
|
29
29
|
}
|
|
30
30
|
describe('countRawEpisodes', () => {
|