@skillsmith/core 0.6.2 → 0.6.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.
- package/CHANGELOG.md +4 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/db/createDatabase.d.ts.map +1 -1
- package/dist/src/db/createDatabase.js +18 -2
- package/dist/src/db/createDatabase.js.map +1 -1
- package/dist/src/db/drivers/betterSqlite3Driver.d.ts +7 -0
- package/dist/src/db/drivers/betterSqlite3Driver.d.ts.map +1 -1
- package/dist/src/db/drivers/betterSqlite3Driver.js +21 -1
- package/dist/src/db/drivers/betterSqlite3Driver.js.map +1 -1
- package/dist/src/db/drivers/corruption.d.ts +31 -0
- package/dist/src/db/drivers/corruption.d.ts.map +1 -0
- package/dist/src/db/drivers/corruption.js +57 -0
- package/dist/src/db/drivers/corruption.js.map +1 -0
- package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.js +48 -7
- package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/meta-list-filter.d.ts +55 -0
- package/dist/src/indexer/meta-list-filter.d.ts.map +1 -0
- package/dist/src/indexer/meta-list-filter.js +65 -0
- package/dist/src/indexer/meta-list-filter.js.map +1 -0
- package/dist/src/indexer/meta-list-filter.test.d.ts +7 -0
- package/dist/src/indexer/meta-list-filter.test.d.ts.map +1 -0
- package/dist/src/indexer/meta-list-filter.test.js +139 -0
- package/dist/src/indexer/meta-list-filter.test.js.map +1 -0
- package/dist/tests/db/corruption.test.d.ts +11 -0
- package/dist/tests/db/corruption.test.d.ts.map +1 -0
- package/dist/tests/db/corruption.test.js +109 -0
- package/dist/tests/db/corruption.test.js.map +1 -0
- package/dist/tests/skill-scanner/allowlist.test.js +5 -1
- package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createDatabase.d.ts","sourceRoot":"","sources":["../../../src/db/createDatabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"createDatabase.d.ts","sourceRoot":"","sources":["../../../src/db/createDatabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAcxE;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,QAAQ,CAAA;AAEpD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,UAAU,EAAE,CA0BrD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAiBjD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,MAAmB,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,QAAQ,CAgBjG;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,GAAE,MAAmB,EACzB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,QAAQ,CAAC,CA2CnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,2BAAqB,CAAA"}
|
|
@@ -16,8 +16,13 @@
|
|
|
16
16
|
* const db = createDatabaseSync(path) // better-sqlite3 only
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
|
-
import { createBetterSqlite3Database, isBetterSqlite3Available, } from './drivers/betterSqlite3Driver.js';
|
|
19
|
+
import { createBetterSqlite3Database, isBetterSqlite3Available, getBetterSqlite3FailureReason, } from './drivers/betterSqlite3Driver.js';
|
|
20
20
|
import { createSqlJsDatabase, isSqlJsAvailable } from './drivers/sqljsDriver.js';
|
|
21
|
+
/**
|
|
22
|
+
* SMI-4807: guard so the WASM-fallback notice is emitted at most once per
|
|
23
|
+
* process, no matter how many database connections are opened.
|
|
24
|
+
*/
|
|
25
|
+
let wasmFallbackNoticeEmitted = false;
|
|
21
26
|
/**
|
|
22
27
|
* Detect which database drivers are available
|
|
23
28
|
* @returns Array of driver info objects
|
|
@@ -128,7 +133,18 @@ export async function createDatabaseAsync(path = ':memory:', options) {
|
|
|
128
133
|
}
|
|
129
134
|
// Fall back to sql.js WASM
|
|
130
135
|
if (isSqlJsAvailable()) {
|
|
131
|
-
|
|
136
|
+
if (!wasmFallbackNoticeEmitted) {
|
|
137
|
+
wasmFallbackNoticeEmitted = true;
|
|
138
|
+
let message = '[Skillsmith] Using WASM SQLite driver ' +
|
|
139
|
+
'(native better-sqlite3 not loaded — expected on direct macOS/npx installs).';
|
|
140
|
+
if (process.env.SKILLSMITH_DEBUG) {
|
|
141
|
+
const reason = getBetterSqlite3FailureReason();
|
|
142
|
+
if (reason) {
|
|
143
|
+
message += ` Reason: ${reason}`;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
console.warn(message);
|
|
147
|
+
}
|
|
132
148
|
return await createSqlJsDatabase(path, options);
|
|
133
149
|
}
|
|
134
150
|
throw new Error('[Skillsmith] No SQLite driver available.\n\n' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createDatabase.js","sourceRoot":"","sources":["../../../src/db/createDatabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,
|
|
1
|
+
{"version":3,"file":"createDatabase.js","sourceRoot":"","sources":["../../../src/db/createDatabase.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,13 @@ export declare class BetterSqlite3Database implements Database {
|
|
|
40
40
|
* @throws Error if better-sqlite3 native module is not available
|
|
41
41
|
*/
|
|
42
42
|
export declare function createBetterSqlite3Database(path?: string, options?: DatabaseOptions): BetterSqlite3Database;
|
|
43
|
+
/**
|
|
44
|
+
* Get the reason the native better-sqlite3 module last failed to load.
|
|
45
|
+
*
|
|
46
|
+
* @returns The failure message, or `undefined` if the native module loaded
|
|
47
|
+
* successfully or has not been checked yet.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getBetterSqlite3FailureReason(): string | undefined;
|
|
43
50
|
/**
|
|
44
51
|
* Check if better-sqlite3 native module is available
|
|
45
52
|
* @returns true if the native module can be loaded
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"betterSqlite3Driver.d.ts","sourceRoot":"","sources":["../../../../src/db/drivers/betterSqlite3Driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAa,eAAe,EAAE,MAAM,0BAA0B,CAAA;AA0C/F;;GAEG;AACH,qBAAa,qBAAsB,YAAW,QAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa,CAAC,QAAQ;IAEvD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAK/C,WAAW,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC;IAK3F,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI/B,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,aAAa,CAAC,QAAQ,CAEnC;CACF;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,GAAE,MAAmB,EACzB,OAAO,CAAC,EAAE,eAAe,GACxB,qBAAqB,CAyBvB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"betterSqlite3Driver.d.ts","sourceRoot":"","sources":["../../../../src/db/drivers/betterSqlite3Driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAa,eAAe,EAAE,MAAM,0BAA0B,CAAA;AA0C/F;;GAEG;AACH,qBAAa,qBAAsB,YAAW,QAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa,CAAC,QAAQ;IAEvD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAK/C,WAAW,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC;IAK3F,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI/B,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,aAAa,CAAC,QAAQ,CAEnC;CACF;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,GAAE,MAAmB,EACzB,OAAO,CAAC,EAAE,eAAe,GACxB,qBAAqB,CAyBvB;AAWD;;;;;GAKG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,GAAG,SAAS,CAElE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAclD"}
|
|
@@ -118,6 +118,23 @@ export function createBetterSqlite3Database(path = ':memory:', options) {
|
|
|
118
118
|
const db = new Database(path, dbOptions);
|
|
119
119
|
return new BetterSqlite3Database(db);
|
|
120
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Captured reason the native driver last failed to load.
|
|
123
|
+
*
|
|
124
|
+
* SMI-4807: `better-sqlite3` is an optionalDependency whose install/dlopen
|
|
125
|
+
* failures were previously swallowed by a bare `catch {}`. We now retain the
|
|
126
|
+
* error message so the WASM-fallback path can surface it under `SKILLSMITH_DEBUG`.
|
|
127
|
+
*/
|
|
128
|
+
let betterSqlite3FailureReason;
|
|
129
|
+
/**
|
|
130
|
+
* Get the reason the native better-sqlite3 module last failed to load.
|
|
131
|
+
*
|
|
132
|
+
* @returns The failure message, or `undefined` if the native module loaded
|
|
133
|
+
* successfully or has not been checked yet.
|
|
134
|
+
*/
|
|
135
|
+
export function getBetterSqlite3FailureReason() {
|
|
136
|
+
return betterSqlite3FailureReason;
|
|
137
|
+
}
|
|
121
138
|
/**
|
|
122
139
|
* Check if better-sqlite3 native module is available
|
|
123
140
|
* @returns true if the native module can be loaded
|
|
@@ -129,9 +146,12 @@ export function isBetterSqlite3Available() {
|
|
|
129
146
|
// Catches ABI mismatch (Node upgrade) and platform mismatch (Linux binary on macOS).
|
|
130
147
|
const testDb = new Database(':memory:');
|
|
131
148
|
testDb.close();
|
|
149
|
+
betterSqlite3FailureReason = undefined;
|
|
132
150
|
return true;
|
|
133
151
|
}
|
|
134
|
-
catch {
|
|
152
|
+
catch (err) {
|
|
153
|
+
// SMI-4807: capture the failure reason instead of silently discarding it.
|
|
154
|
+
betterSqlite3FailureReason = err instanceof Error ? err.message : String(err);
|
|
135
155
|
return false;
|
|
136
156
|
}
|
|
137
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"betterSqlite3Driver.js","sourceRoot":"","sources":["../../../../src/db/drivers/betterSqlite3Driver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"betterSqlite3Driver.js","sourceRoot":"","sources":["../../../../src/db/drivers/betterSqlite3Driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAI3C,4CAA4C;AAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C;;GAEG;AACH,MAAM,sBAAsB;IACG;IAA7B,YAA6B,IAA6B;QAA7B,SAAI,GAAJ,IAAI,CAAyB;IAAG,CAAC;IAE9D,GAAG,CAAC,GAAG,MAAiB;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;QACvC,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,eAAe,EAAE,MAAM,CAAC,eAAe;SACxC,CAAA;IACH,CAAC;IAED,GAAG,CAAC,GAAG,MAAiB;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAkB,CAAA;IAClD,CAAC;IAED,GAAG,CAAC,GAAG,MAAiB;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAQ,CAAA;IACxC,CAAC;IAED,OAAO,CAAC,GAAG,MAAiB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAwB,CAAA;IAC5D,CAAC;IAED,QAAQ;QACN,uDAAuD;QACvD,iEAAiE;IACnE,CAAC;IAED,IAAI,CAAC,GAAG,MAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,EAA0B;QAA1B,OAAE,GAAF,EAAE,CAAwB;IAAG,CAAC;IAE3D,IAAI,CAAC,GAAW;QACd,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,OAAO,CAAc,GAAW;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACjC,OAAO,IAAI,sBAAsB,CAAI,IAAI,CAAC,CAAA;IAC5C,CAAC;IAED,WAAW,CAAiC,EAAwB;QAClE,wDAAwD;QACxD,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAyB,CAAA;IACxD,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;IACjB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAA;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAA;IACrB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAA;IACzB,CAAC;IAED;;;OAGG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAe,UAAU,EACzB,OAAyB;IAEzB,0EAA0E;IAC1E,4DAA4D;IAE5D,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAyB,CAAA;IAElE,sDAAsD;IACtD,8DAA8D;IAC9D,MAAM,SAAS,GAA4B;QACzC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;KAClC,CAAA;IAED,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,SAAS,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IACvC,CAAC;IACD,IAAI,OAAO,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;QACzC,SAAS,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAA;IACjD,CAAC;IACD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAA;IACjC,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAExC,OAAO,IAAI,qBAAqB,CAAC,EAAE,CAAC,CAAA;AACtC,CAAC;AAED;;;;;;GAMG;AACH,IAAI,0BAA8C,CAAA;AAElD;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B;IAC3C,OAAO,0BAA0B,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAyB,CAAA;QAClE,mEAAmE;QACnE,qFAAqF;QACrF,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,CAAC,KAAK,EAAE,CAAA;QACd,0BAA0B,GAAG,SAAS,CAAA;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0EAA0E;QAC1E,0BAA0B,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC7E,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-4484: SQLite corruption detection + self-heal helpers
|
|
3
|
+
*
|
|
4
|
+
* On fresh macOS installs, the native better-sqlite3 driver writes WAL-mode
|
|
5
|
+
* journal files that the WASM driver (sql.js) cannot read. The result is a
|
|
6
|
+
* `database disk image is malformed` error on the next sync.
|
|
7
|
+
*
|
|
8
|
+
* These helpers let both the sql.js driver and the CLI database opener
|
|
9
|
+
* recognise a corruption-class error and recover by backing up the bad file
|
|
10
|
+
* and rebuilding an empty database — instead of crashing the user's command.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Determine whether an error indicates a corrupt / unreadable SQLite file.
|
|
14
|
+
*
|
|
15
|
+
* @param err - The thrown value (Error, string, or anything).
|
|
16
|
+
* @returns true if the error message matches a known corruption marker.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isCorruptionError(err: unknown): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Back up a corrupt SQLite file by renaming it out of the way.
|
|
21
|
+
*
|
|
22
|
+
* The backup path is `${path}.corrupt-<timestamp>` where the timestamp is an
|
|
23
|
+
* ISO string with `:` and `.` replaced by `-` so it is filesystem-safe.
|
|
24
|
+
*
|
|
25
|
+
* @param path - Path to the corrupt database file. Must be a real file path
|
|
26
|
+
* (not `:memory:`) and must exist on disk.
|
|
27
|
+
* @returns The path the corrupt file was moved to.
|
|
28
|
+
* @throws Error if `path` is `:memory:` or the file does not exist.
|
|
29
|
+
*/
|
|
30
|
+
export declare function backupCorruptDbFile(path: string): string;
|
|
31
|
+
//# sourceMappingURL=corruption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corruption.d.ts","sourceRoot":"","sources":["../../../../src/db/drivers/corruption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgBH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYxD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-4484: SQLite corruption detection + self-heal helpers
|
|
3
|
+
*
|
|
4
|
+
* On fresh macOS installs, the native better-sqlite3 driver writes WAL-mode
|
|
5
|
+
* journal files that the WASM driver (sql.js) cannot read. The result is a
|
|
6
|
+
* `database disk image is malformed` error on the next sync.
|
|
7
|
+
*
|
|
8
|
+
* These helpers let both the sql.js driver and the CLI database opener
|
|
9
|
+
* recognise a corruption-class error and recover by backing up the bad file
|
|
10
|
+
* and rebuilding an empty database — instead of crashing the user's command.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, renameSync } from 'node:fs';
|
|
13
|
+
/**
|
|
14
|
+
* Substrings that identify a SQLite corruption-class error.
|
|
15
|
+
* Matched case-insensitively against the error message.
|
|
16
|
+
*/
|
|
17
|
+
const CORRUPTION_MARKERS = [
|
|
18
|
+
'sqlite_corrupt',
|
|
19
|
+
'malformed',
|
|
20
|
+
'not a database',
|
|
21
|
+
'file is encrypted',
|
|
22
|
+
'disk image is malformed',
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Determine whether an error indicates a corrupt / unreadable SQLite file.
|
|
26
|
+
*
|
|
27
|
+
* @param err - The thrown value (Error, string, or anything).
|
|
28
|
+
* @returns true if the error message matches a known corruption marker.
|
|
29
|
+
*/
|
|
30
|
+
export function isCorruptionError(err) {
|
|
31
|
+
const message = (err instanceof Error ? err.message : typeof err === 'string' ? err : String(err)).toLowerCase();
|
|
32
|
+
return CORRUPTION_MARKERS.some((marker) => message.includes(marker));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Back up a corrupt SQLite file by renaming it out of the way.
|
|
36
|
+
*
|
|
37
|
+
* The backup path is `${path}.corrupt-<timestamp>` where the timestamp is an
|
|
38
|
+
* ISO string with `:` and `.` replaced by `-` so it is filesystem-safe.
|
|
39
|
+
*
|
|
40
|
+
* @param path - Path to the corrupt database file. Must be a real file path
|
|
41
|
+
* (not `:memory:`) and must exist on disk.
|
|
42
|
+
* @returns The path the corrupt file was moved to.
|
|
43
|
+
* @throws Error if `path` is `:memory:` or the file does not exist.
|
|
44
|
+
*/
|
|
45
|
+
export function backupCorruptDbFile(path) {
|
|
46
|
+
if (path === ':memory:') {
|
|
47
|
+
throw new Error('[Skillsmith] backupCorruptDbFile: cannot back up an in-memory database');
|
|
48
|
+
}
|
|
49
|
+
if (!existsSync(path)) {
|
|
50
|
+
throw new Error(`[Skillsmith] backupCorruptDbFile: file does not exist: ${path}`);
|
|
51
|
+
}
|
|
52
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
53
|
+
const backupPath = `${path}.corrupt-${timestamp}`;
|
|
54
|
+
renameSync(path, backupPath);
|
|
55
|
+
return backupPath;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=corruption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corruption.js","sourceRoot":"","sources":["../../../../src/db/drivers/corruption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEhD;;;GAGG;AACH,MAAM,kBAAkB,GAAG;IACzB,gBAAgB;IAChB,WAAW;IACX,gBAAgB;IAChB,mBAAmB;IACnB,yBAAyB;CAC1B,CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,OAAO,GAAG,CACd,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjF,CAAC,WAAW,EAAE,CAAA;IAEf,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;AACtE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;IAC3F,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0DAA0D,IAAI,EAAE,CAAC,CAAA;IACnF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAChE,MAAM,UAAU,GAAG,GAAG,IAAI,YAAY,SAAS,EAAE,CAAA;IACjD,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC5B,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqljsDriver.d.ts","sourceRoot":"","sources":["../../../../src/db/drivers/sqljsDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAa,eAAe,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"sqljsDriver.d.ts","sourceRoot":"","sources":["../../../../src/db/drivers/sqljsDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAa,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAa/F,UAAU,aAAa;IACrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;IACpC,MAAM,IAAI,UAAU,CAAA;IACpB,KAAK,IAAI,IAAI,CAAA;CACd;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAA;IACvC,IAAI,IAAI,OAAO,CAAA;IACf,GAAG,IAAI,UAAU,EAAE,CAAA;IACnB,cAAc,IAAI,MAAM,EAAE,CAAA;IAC1B,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;CACb;AAGD,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,CAAA;AACrD,KAAK,eAAe,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;AA2KhE;;GAEG;AACH,qBAAa,oBAAqB,YAAW,QAAQ;IAQjD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,OAAO,CAAC,KAAK,CAAO;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,iBAAiB,CAAI;gBAGV,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,MAAM,EACjC,OAAO,CAAC,EAAE,eAAe;IAM3B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAI/C,WAAW,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC;IAuC3F,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAsB/B,KAAK,IAAI,IAAI;IAYb;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;;OAGG;IACH,MAAM,IAAI,UAAU;IAIpB,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,aAAa,CAE1B;CACF;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,GAAE,MAAmB,EACzB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,oBAAoB,CAAC,CA4D/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAO1C"}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { createRequire } from 'node:module';
|
|
18
18
|
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
19
|
+
import { isCorruptionError, backupCorruptDbFile } from './corruption.js';
|
|
19
20
|
// ESM-compatible require for dynamic module loading
|
|
20
21
|
const require = createRequire(import.meta.url);
|
|
21
22
|
// Cached sql.js module to avoid reloading WASM
|
|
@@ -302,13 +303,53 @@ export async function createSqlJsDatabase(path = ':memory:', options) {
|
|
|
302
303
|
else if (path !== ':memory:' && options?.fileMustExist) {
|
|
303
304
|
throw new Error(`SQLITE_CANTOPEN: unable to open database file: ${path}`);
|
|
304
305
|
}
|
|
305
|
-
|
|
306
|
-
//
|
|
307
|
-
//
|
|
308
|
-
//
|
|
309
|
-
//
|
|
310
|
-
//
|
|
311
|
-
|
|
306
|
+
// Open the database. If the on-disk file is corrupt (e.g. WAL-mode files
|
|
307
|
+
// written by the native driver that sql.js cannot read — SMI-4484), back it
|
|
308
|
+
// up and rebuild an empty database so the next sync repopulates it, instead
|
|
309
|
+
// of crashing the user's command with `database disk image is malformed`.
|
|
310
|
+
//
|
|
311
|
+
// sql.js validates the file lazily — `new SQL.Database(data)` and a no-op
|
|
312
|
+
// PRAGMA can both succeed on garbage bytes; corruption only surfaces on the
|
|
313
|
+
// first read of a page. We therefore probe `sqlite_master` inside the
|
|
314
|
+
// try-block so corruption is detected here rather than at an arbitrary later
|
|
315
|
+
// query the caller cannot recover from.
|
|
316
|
+
let db;
|
|
317
|
+
let partialDb;
|
|
318
|
+
try {
|
|
319
|
+
partialDb = new SQL.Database(data);
|
|
320
|
+
db = partialDb;
|
|
321
|
+
// Set default pragmas for consistency.
|
|
322
|
+
// Note: WAL mode is intentionally NOT set for sql.js because:
|
|
323
|
+
// 1. sql.js operates fully in-memory with manual file persistence
|
|
324
|
+
// 2. Journal modes are meaningless without filesystem integration
|
|
325
|
+
// 3. Setting WAL would create false parity expectations with better-sqlite3
|
|
326
|
+
db.run('PRAGMA foreign_keys = ON');
|
|
327
|
+
// Integrity probe: forces sql.js to read the schema page. Skipped for a
|
|
328
|
+
// brand-new empty database (no `data`) where there is nothing to validate.
|
|
329
|
+
if (data !== undefined) {
|
|
330
|
+
db.run('SELECT name FROM sqlite_master LIMIT 1');
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
// Free the partially-opened handle's WASM heap memory before we rebuild or
|
|
335
|
+
// rethrow — otherwise it leaks for the process lifetime (SMI-4484).
|
|
336
|
+
if (partialDb) {
|
|
337
|
+
try {
|
|
338
|
+
partialDb.close();
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
// handle already unusable — nothing more to free
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (!isCorruptionError(error) || path === ':memory:' || !existsSync(path)) {
|
|
345
|
+
throw error;
|
|
346
|
+
}
|
|
347
|
+
const backupPath = backupCorruptDbFile(path);
|
|
348
|
+
console.warn(`[Skillsmith] The local database at ${path} was corrupt and could not be opened. ` +
|
|
349
|
+
`It has been backed up to ${backupPath} and will be rebuilt on the next sync.`);
|
|
350
|
+
db = new SQL.Database();
|
|
351
|
+
db.run('PRAGMA foreign_keys = ON');
|
|
352
|
+
}
|
|
312
353
|
return new SqlJsDatabaseAdapter(db, path, options);
|
|
313
354
|
}
|
|
314
355
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqljsDriver.js","sourceRoot":"","sources":["../../../../src/db/drivers/sqljsDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"sqljsDriver.js","sourceRoot":"","sources":["../../../../src/db/drivers/sqljsDriver.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @skillsmith/core - Core functionality for skill discovery
|
|
3
3
|
*/
|
|
4
|
-
export declare const VERSION = "0.6.
|
|
4
|
+
export declare const VERSION = "0.6.3";
|
|
5
5
|
export * from './exports/services.js';
|
|
6
6
|
export * from './exports/repositories.js';
|
|
7
7
|
export { createDatabaseSync, createDatabaseAsync } from './db/createDatabase.js';
|
|
8
8
|
export type { Database } from './db/database-interface.js';
|
|
9
|
+
export { isCorruptionError, backupCorruptDbFile } from './db/drivers/corruption.js';
|
|
10
|
+
export { getBetterSqlite3FailureReason } from './db/drivers/betterSqlite3Driver.js';
|
|
9
11
|
export * from './exports/types.js';
|
|
10
12
|
export { SkillsmithApiClient, ApiClientError, createApiClient, generateAnonymousId, ApiCache, createCache, getGlobalCache, DEFAULT_TTL, type ApiClientConfig, } from './api/index.js';
|
|
11
13
|
export { HybridSearch } from './search/index.js';
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,OAAO,UAAU,CAAA;AAO9B,cAAc,uBAAuB,CAAA;AAGrC,cAAc,2BAA2B,CAAA;AAMzC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAChF,YAAY,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @skillsmith/core - Core functionality for skill discovery
|
|
3
3
|
*/
|
|
4
4
|
// Version
|
|
5
|
-
export const VERSION = '0.6.
|
|
5
|
+
export const VERSION = '0.6.3';
|
|
6
6
|
// ============================================================================
|
|
7
7
|
// Grouped Exports from Barrel Files
|
|
8
8
|
// ============================================================================
|
|
@@ -15,6 +15,10 @@ export * from './exports/repositories.js';
|
|
|
15
15
|
// don't always follow the re-export chain correctly
|
|
16
16
|
// SMI-2721 (L1): Export createDatabaseAsync for CLI + enterprise async migration
|
|
17
17
|
export { createDatabaseSync, createDatabaseAsync } from './db/createDatabase.js';
|
|
18
|
+
// SMI-4484: corruption detection + self-heal helpers, reused by the CLI opener.
|
|
19
|
+
export { isCorruptionError, backupCorruptDbFile } from './db/drivers/corruption.js';
|
|
20
|
+
// SMI-4807: native-driver failure reason getter.
|
|
21
|
+
export { getBetterSqlite3FailureReason } from './db/drivers/betterSqlite3Driver.js';
|
|
18
22
|
// Types - All type definitions
|
|
19
23
|
export * from './exports/types.js';
|
|
20
24
|
// ============================================================================
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,UAAU;AACV,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA;AAE9B,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E,gFAAgF;AAChF,cAAc,uBAAuB,CAAA;AAErC,gEAAgE;AAChE,cAAc,2BAA2B,CAAA;AAEzC,4EAA4E;AAC5E,mFAAmF;AACnF,oDAAoD;AACpD,iFAAiF;AACjF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Meta-list (curated link-list) detection for the skill indexer.
|
|
3
|
+
*
|
|
4
|
+
* SMI-4842: Repositories like `awesome-claude-skills` are README-only curated
|
|
5
|
+
* lists of links to other repositories — they are NOT skills and must not be
|
|
6
|
+
* indexed as such. This module provides a conservative, dependency-free
|
|
7
|
+
* predicate that rejects such repos using THREE signals combined. Name match
|
|
8
|
+
* alone is deliberately insufficient, so a legitimately-named skill such as
|
|
9
|
+
* `awesome-foo` that ships a SKILL.md is never wrongly dropped:
|
|
10
|
+
*
|
|
11
|
+
* 1. The repo name matches `awesome-*` (case-insensitive prefix); AND
|
|
12
|
+
* 2. The repo has no SKILL.md (the indexer already tracks SKILL.md presence
|
|
13
|
+
* via its validation step — this module never re-fetches SKILL.md); AND
|
|
14
|
+
* 3. The README is dominated by external links — strictly MORE than 70% of
|
|
15
|
+
* the non-blank README lines contain a markdown link `[...](...)`.
|
|
16
|
+
*
|
|
17
|
+
* This file is the single source of truth for the predicate. The indexer Edge
|
|
18
|
+
* Function (`supabase/functions/indexer/meta-list-filter.ts`) mirrors this
|
|
19
|
+
* logic because Deno isolates cannot import Node workspace packages; the
|
|
20
|
+
* mirrored copy carries a pointer back here and is covered by the same cases.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Strictly-greater-than threshold for the share of non-blank README lines that
|
|
24
|
+
* must contain a markdown link before the README counts as "link-dominated".
|
|
25
|
+
* A README at exactly 0.70 is NOT treated as a meta-list.
|
|
26
|
+
*/
|
|
27
|
+
export declare const META_LIST_LINK_RATIO_THRESHOLD = 0.7;
|
|
28
|
+
/**
|
|
29
|
+
* Signals required to classify a repository as a meta-list. All three are
|
|
30
|
+
* cheap, in-memory values the indexer already has (or can derive without an
|
|
31
|
+
* extra SKILL.md fetch).
|
|
32
|
+
*/
|
|
33
|
+
export interface MetaListSignals {
|
|
34
|
+
/** The GitHub repository name (not a display name from frontmatter). */
|
|
35
|
+
repoName: string;
|
|
36
|
+
/** Whether the repo has a valid SKILL.md (the indexer's existing signal). */
|
|
37
|
+
hasSkillMd: boolean;
|
|
38
|
+
/** Raw README markdown content (empty string if absent). */
|
|
39
|
+
readme: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Compute the fraction of non-blank README lines that contain a markdown link.
|
|
43
|
+
* Returns 0 for an empty/blank README so the link-dominance signal cannot fire.
|
|
44
|
+
*/
|
|
45
|
+
export declare function readmeLinkRatio(readme: string): number;
|
|
46
|
+
/**
|
|
47
|
+
* Conservative predicate: is this repository a curated `awesome-*` link-list
|
|
48
|
+
* rather than an actual skill?
|
|
49
|
+
*
|
|
50
|
+
* Returns true only when ALL THREE signals hold (see module docs). This
|
|
51
|
+
* deliberately avoids excluding a real skill named `awesome-foo` that ships a
|
|
52
|
+
* SKILL.md, and avoids excluding any repo whose README is mostly prose.
|
|
53
|
+
*/
|
|
54
|
+
export declare function isMetaListRepo(signals: MetaListSignals): boolean;
|
|
55
|
+
//# sourceMappingURL=meta-list-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-list-filter.d.ts","sourceRoot":"","sources":["../../../src/indexer/meta-list-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAA;AAQjD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,UAAU,EAAE,OAAO,CAAA;IACnB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAYhE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Meta-list (curated link-list) detection for the skill indexer.
|
|
3
|
+
*
|
|
4
|
+
* SMI-4842: Repositories like `awesome-claude-skills` are README-only curated
|
|
5
|
+
* lists of links to other repositories — they are NOT skills and must not be
|
|
6
|
+
* indexed as such. This module provides a conservative, dependency-free
|
|
7
|
+
* predicate that rejects such repos using THREE signals combined. Name match
|
|
8
|
+
* alone is deliberately insufficient, so a legitimately-named skill such as
|
|
9
|
+
* `awesome-foo` that ships a SKILL.md is never wrongly dropped:
|
|
10
|
+
*
|
|
11
|
+
* 1. The repo name matches `awesome-*` (case-insensitive prefix); AND
|
|
12
|
+
* 2. The repo has no SKILL.md (the indexer already tracks SKILL.md presence
|
|
13
|
+
* via its validation step — this module never re-fetches SKILL.md); AND
|
|
14
|
+
* 3. The README is dominated by external links — strictly MORE than 70% of
|
|
15
|
+
* the non-blank README lines contain a markdown link `[...](...)`.
|
|
16
|
+
*
|
|
17
|
+
* This file is the single source of truth for the predicate. The indexer Edge
|
|
18
|
+
* Function (`supabase/functions/indexer/meta-list-filter.ts`) mirrors this
|
|
19
|
+
* logic because Deno isolates cannot import Node workspace packages; the
|
|
20
|
+
* mirrored copy carries a pointer back here and is covered by the same cases.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Strictly-greater-than threshold for the share of non-blank README lines that
|
|
24
|
+
* must contain a markdown link before the README counts as "link-dominated".
|
|
25
|
+
* A README at exactly 0.70 is NOT treated as a meta-list.
|
|
26
|
+
*/
|
|
27
|
+
export const META_LIST_LINK_RATIO_THRESHOLD = 0.7;
|
|
28
|
+
/** Matches a `awesome-` prefix on the repo name, case-insensitive. */
|
|
29
|
+
const AWESOME_NAME_PREFIX = /^awesome-/i;
|
|
30
|
+
/** Matches a markdown link `[text](url)` anywhere on a line. */
|
|
31
|
+
const MARKDOWN_LINK = /\[[^\]]*\]\([^)]+\)/;
|
|
32
|
+
/**
|
|
33
|
+
* Compute the fraction of non-blank README lines that contain a markdown link.
|
|
34
|
+
* Returns 0 for an empty/blank README so the link-dominance signal cannot fire.
|
|
35
|
+
*/
|
|
36
|
+
export function readmeLinkRatio(readme) {
|
|
37
|
+
const nonBlankLines = readme.split('\n').filter((line) => line.trim().length > 0);
|
|
38
|
+
if (nonBlankLines.length === 0) {
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
const linkLines = nonBlankLines.filter((line) => MARKDOWN_LINK.test(line)).length;
|
|
42
|
+
return linkLines / nonBlankLines.length;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Conservative predicate: is this repository a curated `awesome-*` link-list
|
|
46
|
+
* rather than an actual skill?
|
|
47
|
+
*
|
|
48
|
+
* Returns true only when ALL THREE signals hold (see module docs). This
|
|
49
|
+
* deliberately avoids excluding a real skill named `awesome-foo` that ships a
|
|
50
|
+
* SKILL.md, and avoids excluding any repo whose README is mostly prose.
|
|
51
|
+
*/
|
|
52
|
+
export function isMetaListRepo(signals) {
|
|
53
|
+
// Signal 1: name matches the `awesome-` prefix.
|
|
54
|
+
if (!AWESOME_NAME_PREFIX.test(signals.repoName)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
// Signal 2: no SKILL.md — a real skill named `awesome-foo` keeps its SKILL.md
|
|
58
|
+
// and is therefore never excluded here.
|
|
59
|
+
if (signals.hasSkillMd) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
// Signal 3: README is dominated by external links (strictly above threshold).
|
|
63
|
+
return readmeLinkRatio(signals.readme) > META_LIST_LINK_RATIO_THRESHOLD;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=meta-list-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-list-filter.js","sourceRoot":"","sources":["../../../src/indexer/meta-list-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAA;AAEjD,sEAAsE;AACtE,MAAM,mBAAmB,GAAG,YAAY,CAAA;AAExC,gEAAgE;AAChE,MAAM,aAAa,GAAG,qBAAqB,CAAA;AAgB3C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACjF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;IACjF,OAAO,SAAS,GAAG,aAAa,CAAC,MAAM,CAAA;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,gDAAgD;IAChD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,8EAA8E;IAC9E,wCAAwC;IACxC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,8EAA8E;IAC9E,OAAO,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,8BAA8B,CAAA;AACzE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-4842: Tests for isMetaListRepo() — the conservative predicate that
|
|
3
|
+
* excludes curated `awesome-*` link-list repos (no SKILL.md, README dominated
|
|
4
|
+
* by external links) from being indexed as skills.
|
|
5
|
+
*/
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=meta-list-filter.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-list-filter.test.d.ts","sourceRoot":"","sources":["../../../src/indexer/meta-list-filter.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|