@mmnto/totem 1.3.0 → 1.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/dist/compiler-schema.d.ts +201 -0
- package/dist/compiler-schema.d.ts.map +1 -0
- package/dist/compiler-schema.js +46 -0
- package/dist/compiler-schema.js.map +1 -0
- package/dist/compiler.d.ts +14 -230
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +17 -380
- package/dist/compiler.js.map +1 -1
- package/dist/diff-parser.d.ts +8 -0
- package/dist/diff-parser.d.ts.map +1 -0
- package/dist/diff-parser.js +70 -0
- package/dist/diff-parser.js.map +1 -0
- package/dist/embedders/embedder.d.ts.map +1 -1
- package/dist/embedders/embedder.js +3 -7
- package/dist/embedders/embedder.js.map +1 -1
- package/dist/embedders/gemini-embedder.d.ts.map +1 -1
- package/dist/embedders/gemini-embedder.js +7 -9
- package/dist/embedders/gemini-embedder.js.map +1 -1
- package/dist/embedders/openai-embedder.d.ts.map +1 -1
- package/dist/embedders/openai-embedder.js +4 -4
- package/dist/embedders/openai-embedder.js.map +1 -1
- package/dist/exporter.d.ts.map +1 -1
- package/dist/exporter.js +3 -2
- package/dist/exporter.js.map +1 -1
- package/dist/lock.d.ts.map +1 -1
- package/dist/lock.js +2 -2
- package/dist/lock.js.map +1 -1
- package/dist/rule-engine.d.ts +31 -0
- package/dist/rule-engine.d.ts.map +1 -0
- package/dist/rule-engine.js +278 -0
- package/dist/rule-engine.js.map +1 -0
- package/dist/sarif.d.ts.map +1 -1
- package/dist/sarif.js +2 -1
- package/dist/sarif.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TotemConfigError, TotemError } from '../errors.js';
|
|
1
2
|
const DEFAULT_DIMENSIONS = 768;
|
|
2
3
|
const DEFAULT_MODEL = 'gemini-embedding-2-preview';
|
|
3
4
|
const MAX_BATCH_SIZE = 100; // Gemini supports up to 100 texts per batch
|
|
@@ -32,9 +33,7 @@ async function importGeminiSdk() {
|
|
|
32
33
|
return await import('@google/genai');
|
|
33
34
|
}
|
|
34
35
|
catch {
|
|
35
|
-
throw new
|
|
36
|
-
'Install it with: pnpm add @google/genai\n' +
|
|
37
|
-
"Or use provider: 'openai' in your embedding config.");
|
|
36
|
+
throw new TotemConfigError('Gemini SDK (@google/genai) is not installed.', "Install it with: pnpm add @google/genai — or use provider: 'openai' in your embedding config.", 'CONFIG_MISSING');
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
39
|
/**
|
|
@@ -50,8 +49,7 @@ export class GeminiEmbedder {
|
|
|
50
49
|
this.dimensions = dimensions ?? DEFAULT_DIMENSIONS;
|
|
51
50
|
const apiKey = process.env['GEMINI_API_KEY'] ?? process.env['GOOGLE_API_KEY'];
|
|
52
51
|
if (!apiKey) {
|
|
53
|
-
throw new
|
|
54
|
-
'Set GEMINI_API_KEY (or GOOGLE_API_KEY) in your .env file.');
|
|
52
|
+
throw new TotemConfigError('No Gemini API key found.', 'Set GEMINI_API_KEY (or GOOGLE_API_KEY) in your .env file.', 'CONFIG_MISSING');
|
|
55
53
|
}
|
|
56
54
|
this.apiKey = apiKey;
|
|
57
55
|
}
|
|
@@ -81,11 +79,11 @@ export class GeminiEmbedder {
|
|
|
81
79
|
},
|
|
82
80
|
});
|
|
83
81
|
if (!response.embeddings || response.embeddings.length !== batch.length) {
|
|
84
|
-
throw new
|
|
82
|
+
throw new TotemError('EMBEDDING_UNAVAILABLE', `Expected ${batch.length} embeddings, got ${response.embeddings?.length ?? 0}`, 'This may be a transient Gemini API issue. Retry with `totem sync`.');
|
|
85
83
|
}
|
|
86
84
|
return response.embeddings.map((e) => {
|
|
87
85
|
if (!e.values)
|
|
88
|
-
throw new
|
|
86
|
+
throw new TotemError('EMBEDDING_UNAVAILABLE', 'Embedding response missing values', 'This may be a transient Gemini API issue. Retry with `totem sync`.');
|
|
89
87
|
return e.values;
|
|
90
88
|
});
|
|
91
89
|
}
|
|
@@ -97,8 +95,8 @@ export class GeminiEmbedder {
|
|
|
97
95
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
98
96
|
}
|
|
99
97
|
}
|
|
100
|
-
const
|
|
101
|
-
throw new
|
|
98
|
+
const detail = lastErr instanceof Error ? lastErr.message : String(lastErr);
|
|
99
|
+
throw new TotemError('EMBEDDING_UNAVAILABLE', `Gemini embedding failed after ${MAX_RETRIES + 1} attempts: ${detail}`, 'Check your GEMINI_API_KEY and network connection, then retry with `totem sync`.');
|
|
102
100
|
}
|
|
103
101
|
}
|
|
104
102
|
//# sourceMappingURL=gemini-embedder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-embedder.js","sourceRoot":"","sources":["../../src/embedders/gemini-embedder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gemini-embedder.js","sourceRoot":"","sources":["../../src/embedders/gemini-embedder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-embedder.d.ts","sourceRoot":"","sources":["../../src/embedders/openai-embedder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai-embedder.d.ts","sourceRoot":"","sources":["../../src/embedders/openai-embedder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAO9C,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,GAAE,MAAiC,EAAE,UAAU,CAAC,EAAE,MAAM;IAgBnE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAkBnC,cAAc;CA0B7B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import OpenAI from 'openai';
|
|
2
|
+
import { TotemConfigError, TotemError } from '../errors.js';
|
|
2
3
|
const MAX_BATCH_SIZE = 2048;
|
|
3
4
|
const DEFAULT_DIMENSIONS = 1536;
|
|
4
5
|
const MAX_RETRIES = 3;
|
|
@@ -12,8 +13,7 @@ export class OpenAIEmbedder {
|
|
|
12
13
|
this.dimensions = dimensions ?? DEFAULT_DIMENSIONS;
|
|
13
14
|
const apiKey = process.env['OPENAI_API_KEY'];
|
|
14
15
|
if (!apiKey) {
|
|
15
|
-
throw new
|
|
16
|
-
"Set OPENAI_API_KEY in your .env or configure 'ollama' in totem.config.ts.");
|
|
16
|
+
throw new TotemConfigError('No OpenAI API key found.', "Set OPENAI_API_KEY in your .env or configure provider: 'ollama' in totem.config.ts.", 'CONFIG_MISSING');
|
|
17
17
|
}
|
|
18
18
|
this.client = new OpenAI({ apiKey });
|
|
19
19
|
}
|
|
@@ -49,8 +49,8 @@ export class OpenAIEmbedder {
|
|
|
49
49
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
-
const
|
|
53
|
-
throw new
|
|
52
|
+
const detail = lastErr instanceof Error ? lastErr.message : String(lastErr);
|
|
53
|
+
throw new TotemError('EMBEDDING_UNAVAILABLE', `OpenAI embedding failed after ${MAX_RETRIES + 1} attempts: ${detail}`, 'Check your OPENAI_API_KEY and network connection, then retry with `totem sync`.');
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
//# sourceMappingURL=openai-embedder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-embedder.js","sourceRoot":"","sources":["../../src/embedders/openai-embedder.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-embedder.js","sourceRoot":"","sources":["../../src/embedders/openai-embedder.ts"],"names":[],"mappings":"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"}
|
package/dist/exporter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,eAAO,MAAM,cAAc,mCAAmC,CAAC;AAC/D,eAAO,MAAM,YAAY,iCAAiC,CAAC;AAI3D;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAiBvE;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CA6B3F;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAe/E"}
|
package/dist/exporter.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
+
import { TotemParseError } from './errors.js';
|
|
3
4
|
// ─── Constants ─────────────────────────────────────────
|
|
4
5
|
export const SENTINEL_START = '<!-- totem:generated:start -->';
|
|
5
6
|
export const SENTINEL_END = '<!-- totem:generated:end -->';
|
|
@@ -35,10 +36,10 @@ export function injectSentinelBlock(existingContent, generatedBlock) {
|
|
|
35
36
|
const startIdx = existingContent.indexOf(SENTINEL_START);
|
|
36
37
|
const endIdx = existingContent.indexOf(SENTINEL_END);
|
|
37
38
|
if (startIdx !== -1 && endIdx === -1) {
|
|
38
|
-
throw new
|
|
39
|
+
throw new TotemParseError(`Found ${SENTINEL_START} without matching ${SENTINEL_END}.`, 'Fix the target file manually — ensure both sentinel markers are present and correctly ordered.');
|
|
39
40
|
}
|
|
40
41
|
if (startIdx !== -1 && endIdx !== -1 && endIdx < startIdx) {
|
|
41
|
-
throw new
|
|
42
|
+
throw new TotemParseError(`Found ${SENTINEL_END} before ${SENTINEL_START}.`, 'Fix the target file manually — ensure sentinel markers appear in the correct order.');
|
|
42
43
|
}
|
|
43
44
|
if (startIdx !== -1 && endIdx !== -1) {
|
|
44
45
|
const before = existingContent.slice(0, startIdx);
|
package/dist/exporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"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"}
|
package/dist/lock.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+DH;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,MAAM,IAAI,CAAC,CAwFrB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,CAAC,CAAC,CA6CZ"}
|
package/dist/lock.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import * as fs from 'node:fs';
|
|
9
9
|
import * as path from 'node:path';
|
|
10
|
+
import { TotemError } from './errors.js';
|
|
10
11
|
const LOCK_FILE = 'sync.lock';
|
|
11
12
|
const STALE_THRESHOLD_MS = 120_000; // 2 minutes — sync can take 30-60s on large repos
|
|
12
13
|
const MAX_RETRIES = 20;
|
|
@@ -137,8 +138,7 @@ export async function acquireLock(totemDir, onWarn) {
|
|
|
137
138
|
throw err;
|
|
138
139
|
}
|
|
139
140
|
}
|
|
140
|
-
throw new
|
|
141
|
-
`Another totem process may be running. Check ${file} or delete it manually.`);
|
|
141
|
+
throw new TotemError('SYNC_FAILED', `Could not acquire sync lock after ${MAX_RETRIES} attempts.`, `Another totem process may be running. Check ${file} or delete it manually.`);
|
|
142
142
|
}
|
|
143
143
|
/**
|
|
144
144
|
* Execute a function while holding the sync lock.
|
package/dist/lock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CompiledRule, DiffAddition, RuleEventCallback, Violation } from './compiler-schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check if a file path matches a single glob pattern.
|
|
4
|
+
* Supports: `*.ext`, `**\/*.ext`, `dir/**\/*.ext`, `dir/**`, literal filenames.
|
|
5
|
+
*/
|
|
6
|
+
export declare function matchesGlob(filePath: string, glob: string): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Apply compiled rules against pre-extracted diff additions.
|
|
9
|
+
* Skips additions with non-code AST context (strings, comments, regex).
|
|
10
|
+
* Optional `onRuleEvent` callback enables observability metrics collection.
|
|
11
|
+
*/
|
|
12
|
+
export declare function applyRulesToAdditions(rules: CompiledRule[], additions: DiffAddition[], onRuleEvent?: RuleEventCallback): Violation[];
|
|
13
|
+
/**
|
|
14
|
+
* Apply AST-engine compiled rules against pre-extracted diff additions.
|
|
15
|
+
* Handles both Tree-sitter S-expression ('ast') and ast-grep ('ast-grep') engines.
|
|
16
|
+
* Async because it reads files and runs Tree-sitter queries.
|
|
17
|
+
* Handles fileGlobs filtering and suppression same as regex rules.
|
|
18
|
+
*/
|
|
19
|
+
export declare function applyAstRulesToAdditions(rules: CompiledRule[], additions: DiffAddition[], cwd: string, onRuleEvent?: RuleEventCallback): Promise<Violation[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Apply **regex-engine** compiled rules against added lines from a diff.
|
|
22
|
+
* This is a convenience wrapper that only handles 'regex' engine rules.
|
|
23
|
+
* For 'ast' and 'ast-grep' rules, call `applyAstRulesToAdditions` separately.
|
|
24
|
+
*
|
|
25
|
+
* @param rules — The full list of compiled rules. This function filters to regex rules.
|
|
26
|
+
* @param diff — The unified diff string.
|
|
27
|
+
* @param excludeFiles — File paths to skip (e.g., compiled-rules.json to avoid self-matches).
|
|
28
|
+
* @returns All regex-based violations found.
|
|
29
|
+
*/
|
|
30
|
+
export declare function applyRules(rules: CompiledRule[], diff: string, excludeFiles?: string[]): Violation[];
|
|
31
|
+
//# sourceMappingURL=rule-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-engine.d.ts","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACV,MAAM,sBAAsB,CAAC;AAK9B;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAwCnE;AAsCD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EAAE,EACrB,SAAS,EAAE,YAAY,EAAE,EACzB,WAAW,CAAC,EAAE,iBAAiB,GAC9B,SAAS,EAAE,CA+Cb;AAID;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,YAAY,EAAE,EACrB,SAAS,EAAE,YAAY,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,iBAAiB,GAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAiItB;AAID;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,EAAE,EACrB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,SAAS,EAAE,CAUb"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { extensionToLanguage } from './ast-classifier.js';
|
|
4
|
+
import { matchAstGrepPatternsBatch } from './ast-grep-query.js';
|
|
5
|
+
import { matchAstQueriesBatch } from './ast-query.js';
|
|
6
|
+
import { extractAddedLines } from './diff-parser.js';
|
|
7
|
+
// ─── File glob matching ─────────────────────────────
|
|
8
|
+
/**
|
|
9
|
+
* Check if a file path matches a single glob pattern.
|
|
10
|
+
* Supports: `*.ext`, `**\/*.ext`, `dir/**\/*.ext`, `dir/**`, literal filenames.
|
|
11
|
+
*/
|
|
12
|
+
export function matchesGlob(filePath, glob) {
|
|
13
|
+
// Normalize separators
|
|
14
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
15
|
+
// *.ext — match file extension anywhere
|
|
16
|
+
if (glob.startsWith('*.')) {
|
|
17
|
+
return normalized.endsWith(glob.slice(1));
|
|
18
|
+
}
|
|
19
|
+
// **/*.ext — same as *.ext (match extension anywhere in path)
|
|
20
|
+
if (glob.startsWith('**/')) {
|
|
21
|
+
return matchesGlob(normalized, glob.slice(3));
|
|
22
|
+
}
|
|
23
|
+
// dir/**/*.ext or dir/** — directory-prefixed recursive glob
|
|
24
|
+
const dstarIdx = glob.indexOf('/**/');
|
|
25
|
+
if (dstarIdx > 0) {
|
|
26
|
+
const prefix = glob.slice(0, dstarIdx);
|
|
27
|
+
const suffix = glob.slice(dstarIdx + 4); // after "/**/"
|
|
28
|
+
if (!normalized.startsWith(prefix + '/'))
|
|
29
|
+
return false;
|
|
30
|
+
const rest = normalized.slice(prefix.length + 1);
|
|
31
|
+
return suffix === '' || matchesGlob(rest, suffix);
|
|
32
|
+
}
|
|
33
|
+
// dir/** — match anything under directory (no trailing pattern)
|
|
34
|
+
if (glob.endsWith('/**')) {
|
|
35
|
+
const prefix = glob.slice(0, -3);
|
|
36
|
+
return normalized.startsWith(prefix + '/');
|
|
37
|
+
}
|
|
38
|
+
// dir/*.ext — single-star, non-recursive (matches files in exact directory)
|
|
39
|
+
const singleStarIdx = glob.indexOf('/*.');
|
|
40
|
+
// totem-ignore-next-line — this IS the glob matcher
|
|
41
|
+
if (singleStarIdx > 0 && !glob.includes('**')) {
|
|
42
|
+
const prefix = glob.slice(0, singleStarIdx);
|
|
43
|
+
const ext = glob.slice(singleStarIdx + 2); // "*.ext" portion
|
|
44
|
+
if (!normalized.startsWith(prefix + '/'))
|
|
45
|
+
return false;
|
|
46
|
+
const rest = normalized.slice(prefix.length + 1);
|
|
47
|
+
// Must be a direct child (no further slashes) and match the extension
|
|
48
|
+
return !rest.includes('/') && rest.endsWith(ext); // totem-ignore — this IS the glob matcher
|
|
49
|
+
}
|
|
50
|
+
// Literal filename match (e.g., "Dockerfile")
|
|
51
|
+
return normalized === glob || normalized.endsWith('/' + glob);
|
|
52
|
+
}
|
|
53
|
+
function fileMatchesGlobs(filePath, globs) {
|
|
54
|
+
const positive = globs.filter((g) => !g.startsWith('!'));
|
|
55
|
+
const negative = globs.filter((g) => g.startsWith('!')).map((g) => g.slice(1));
|
|
56
|
+
const positiveMatch = positive.length === 0 || positive.some((g) => matchesGlob(filePath, g));
|
|
57
|
+
const negativeMatch = negative.some((g) => matchesGlob(filePath, g));
|
|
58
|
+
return positiveMatch && !negativeMatch;
|
|
59
|
+
}
|
|
60
|
+
// ─── Inline suppression ─────────────────────────────
|
|
61
|
+
const SUPPRESS_MARKER = 'totem-ignore';
|
|
62
|
+
const SUPPRESS_NEXT_LINE_MARKER = 'totem-ignore-next-line';
|
|
63
|
+
/**
|
|
64
|
+
* Check if a line should be suppressed via inline directives.
|
|
65
|
+
* Supports two forms:
|
|
66
|
+
* - Same-line: code(); // totem-ignore (suppresses all rules on this line)
|
|
67
|
+
* - Next-line: // totem-ignore-next-line on the preceding line (suppresses all rules on this line)
|
|
68
|
+
*
|
|
69
|
+
* Syntax-agnostic: works with any comment style (//, #, HTML comments, block comments).
|
|
70
|
+
*/
|
|
71
|
+
function isSuppressed(line, precedingLine) {
|
|
72
|
+
// Same-line: 'totem-ignore' substring also matches 'totem-ignore-next-line',
|
|
73
|
+
// so directive lines themselves are inherently suppressed.
|
|
74
|
+
if (line.includes(SUPPRESS_MARKER))
|
|
75
|
+
return true;
|
|
76
|
+
// Next-line: preceding line (context or added) contains the next-line directive
|
|
77
|
+
if (precedingLine != null && precedingLine.includes(SUPPRESS_NEXT_LINE_MARKER))
|
|
78
|
+
return true;
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
// ─── Regex rule execution ───────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Apply compiled rules against pre-extracted diff additions.
|
|
84
|
+
* Skips additions with non-code AST context (strings, comments, regex).
|
|
85
|
+
* Optional `onRuleEvent` callback enables observability metrics collection.
|
|
86
|
+
*/
|
|
87
|
+
export function applyRulesToAdditions(rules, additions, onRuleEvent) {
|
|
88
|
+
if (additions.length === 0 || rules.length === 0)
|
|
89
|
+
return [];
|
|
90
|
+
const violations = [];
|
|
91
|
+
// Only process regex-engine rules — AST rules have pattern: '' which would match everything
|
|
92
|
+
const regexRules = rules.filter((r) => r.engine === 'regex' || !r.engine);
|
|
93
|
+
for (const rule of regexRules) {
|
|
94
|
+
let re;
|
|
95
|
+
try {
|
|
96
|
+
re = new RegExp(rule.pattern);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Skip invalid patterns (shouldn't happen if validation gate works)
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
for (const addition of additions) {
|
|
103
|
+
// Skip non-code lines when AST context is available
|
|
104
|
+
if (addition.astContext && addition.astContext !== 'code')
|
|
105
|
+
continue;
|
|
106
|
+
// Skip if rule has fileGlobs and this file doesn't match
|
|
107
|
+
if (rule.fileGlobs && rule.fileGlobs.length > 0) {
|
|
108
|
+
if (!fileMatchesGlobs(addition.file, rule.fileGlobs))
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
// Skip if suppressed via inline directive
|
|
112
|
+
if (isSuppressed(addition.line, addition.precedingLine)) {
|
|
113
|
+
if (re.test(addition.line)) {
|
|
114
|
+
onRuleEvent?.('suppress', rule.lessonHash);
|
|
115
|
+
}
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (re.test(addition.line)) {
|
|
119
|
+
onRuleEvent?.('trigger', rule.lessonHash);
|
|
120
|
+
violations.push({
|
|
121
|
+
rule,
|
|
122
|
+
file: addition.file,
|
|
123
|
+
line: addition.line,
|
|
124
|
+
lineNumber: addition.lineNumber,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return violations;
|
|
130
|
+
}
|
|
131
|
+
// ─── AST rule execution ─────────────────────────────
|
|
132
|
+
/**
|
|
133
|
+
* Apply AST-engine compiled rules against pre-extracted diff additions.
|
|
134
|
+
* Handles both Tree-sitter S-expression ('ast') and ast-grep ('ast-grep') engines.
|
|
135
|
+
* Async because it reads files and runs Tree-sitter queries.
|
|
136
|
+
* Handles fileGlobs filtering and suppression same as regex rules.
|
|
137
|
+
*/
|
|
138
|
+
export async function applyAstRulesToAdditions(rules, additions, cwd, onRuleEvent) {
|
|
139
|
+
const treeSitterRules = rules.filter((r) => r.engine === 'ast' && r.astQuery);
|
|
140
|
+
const astGrepRules = rules.filter((r) => r.engine === 'ast-grep' && r.astGrepPattern);
|
|
141
|
+
if ((treeSitterRules.length === 0 && astGrepRules.length === 0) || additions.length === 0) {
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
// Group additions by file
|
|
145
|
+
const byFile = new Map();
|
|
146
|
+
for (const a of additions) {
|
|
147
|
+
const existing = byFile.get(a.file);
|
|
148
|
+
if (existing) {
|
|
149
|
+
existing.push(a);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
byFile.set(a.file, [a]);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const violations = [];
|
|
156
|
+
// Process each file once — batch all applicable queries per file
|
|
157
|
+
for (const [file, fileAdditions] of byFile) {
|
|
158
|
+
// Check language support
|
|
159
|
+
const ext = path.extname(file);
|
|
160
|
+
if (!extensionToLanguage(ext))
|
|
161
|
+
continue;
|
|
162
|
+
// Collect added line numbers, filtering suppressed lines
|
|
163
|
+
const addedLineNumbers = [];
|
|
164
|
+
for (const addition of fileAdditions) {
|
|
165
|
+
if (addition.astContext && addition.astContext !== 'code')
|
|
166
|
+
continue;
|
|
167
|
+
if (isSuppressed(addition.line, addition.precedingLine))
|
|
168
|
+
continue;
|
|
169
|
+
addedLineNumbers.push(addition.lineNumber);
|
|
170
|
+
}
|
|
171
|
+
if (addedLineNumbers.length === 0)
|
|
172
|
+
continue;
|
|
173
|
+
// ── Tree-sitter S-expression rules ────────────────
|
|
174
|
+
if (treeSitterRules.length > 0) {
|
|
175
|
+
const applicableTreeSitter = treeSitterRules.filter((rule) => {
|
|
176
|
+
if (rule.fileGlobs && rule.fileGlobs.length > 0) {
|
|
177
|
+
return fileMatchesGlobs(file, rule.fileGlobs);
|
|
178
|
+
}
|
|
179
|
+
return true;
|
|
180
|
+
});
|
|
181
|
+
if (applicableTreeSitter.length > 0) {
|
|
182
|
+
// Batch: parse file once, run all queries against the cached tree
|
|
183
|
+
const queries = applicableTreeSitter.map((rule) => ({
|
|
184
|
+
astQuery: rule.astQuery,
|
|
185
|
+
addedLineNumbers,
|
|
186
|
+
}));
|
|
187
|
+
const batchResults = await matchAstQueriesBatch(file, queries, cwd);
|
|
188
|
+
// Map results back to violations
|
|
189
|
+
for (const rule of applicableTreeSitter) {
|
|
190
|
+
const matches = batchResults.get(rule.astQuery) ?? [];
|
|
191
|
+
for (const match of matches) {
|
|
192
|
+
const addition = fileAdditions.find((a) => a.lineNumber === match.lineNumber);
|
|
193
|
+
if (addition && isSuppressed(addition.line, addition.precedingLine)) {
|
|
194
|
+
onRuleEvent?.('suppress', rule.lessonHash);
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
onRuleEvent?.('trigger', rule.lessonHash);
|
|
198
|
+
violations.push({
|
|
199
|
+
rule,
|
|
200
|
+
file,
|
|
201
|
+
line: match.lineText,
|
|
202
|
+
lineNumber: match.lineNumber,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// ── ast-grep structural pattern rules ─────────────
|
|
209
|
+
if (astGrepRules.length > 0) {
|
|
210
|
+
const applicableAstGrep = astGrepRules.filter((rule) => {
|
|
211
|
+
if (rule.fileGlobs && rule.fileGlobs.length > 0) {
|
|
212
|
+
return fileMatchesGlobs(file, rule.fileGlobs);
|
|
213
|
+
}
|
|
214
|
+
return true;
|
|
215
|
+
});
|
|
216
|
+
if (applicableAstGrep.length > 0) {
|
|
217
|
+
// Read file content once for all ast-grep rules on this file
|
|
218
|
+
let content = null;
|
|
219
|
+
try {
|
|
220
|
+
const fullPath = path.resolve(cwd, file);
|
|
221
|
+
content = await fs.promises.readFile(fullPath, 'utf-8');
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Fall through — content stays null
|
|
225
|
+
}
|
|
226
|
+
if (content) {
|
|
227
|
+
// Batch: parse file once, run all patterns
|
|
228
|
+
const queries = applicableAstGrep.map((rule) => ({
|
|
229
|
+
rule: rule.astGrepPattern,
|
|
230
|
+
addedLineNumbers,
|
|
231
|
+
}));
|
|
232
|
+
const batchResults = matchAstGrepPatternsBatch(content, ext, queries);
|
|
233
|
+
for (let i = 0; i < applicableAstGrep.length; i++) {
|
|
234
|
+
const rule = applicableAstGrep[i];
|
|
235
|
+
const matches = batchResults[i] ?? [];
|
|
236
|
+
for (const match of matches) {
|
|
237
|
+
const addition = fileAdditions.find((a) => a.lineNumber === match.lineNumber);
|
|
238
|
+
if (addition && isSuppressed(addition.line, addition.precedingLine)) {
|
|
239
|
+
onRuleEvent?.('suppress', rule.lessonHash);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
onRuleEvent?.('trigger', rule.lessonHash);
|
|
243
|
+
violations.push({
|
|
244
|
+
rule,
|
|
245
|
+
file,
|
|
246
|
+
line: match.lineText,
|
|
247
|
+
lineNumber: match.lineNumber,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return violations;
|
|
256
|
+
}
|
|
257
|
+
// ─── Convenience wrapper ────────────────────────────
|
|
258
|
+
/**
|
|
259
|
+
* Apply **regex-engine** compiled rules against added lines from a diff.
|
|
260
|
+
* This is a convenience wrapper that only handles 'regex' engine rules.
|
|
261
|
+
* For 'ast' and 'ast-grep' rules, call `applyAstRulesToAdditions` separately.
|
|
262
|
+
*
|
|
263
|
+
* @param rules — The full list of compiled rules. This function filters to regex rules.
|
|
264
|
+
* @param diff — The unified diff string.
|
|
265
|
+
* @param excludeFiles — File paths to skip (e.g., compiled-rules.json to avoid self-matches).
|
|
266
|
+
* @returns All regex-based violations found.
|
|
267
|
+
*/
|
|
268
|
+
export function applyRules(rules, diff, excludeFiles) {
|
|
269
|
+
let additions = extractAddedLines(diff);
|
|
270
|
+
if (additions.length === 0 || rules.length === 0)
|
|
271
|
+
return [];
|
|
272
|
+
if (excludeFiles && excludeFiles.length > 0) {
|
|
273
|
+
const excluded = new Set(excludeFiles);
|
|
274
|
+
additions = additions.filter((a) => !excluded.has(a.file));
|
|
275
|
+
}
|
|
276
|
+
return applyRulesToAdditions(rules, additions);
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=rule-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/sarif.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG7D,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AAIpD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;YAChB,cAAc,EAAE,MAAM,CAAC;YACvB,KAAK,EAAE,wBAAwB,EAAE,CAAC;YAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACrC,CAAC;KACH,CAAC;IACF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,eAAe,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE;QAChB,gBAAgB,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAClC,MAAM,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAID,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,SAAS,EAAE,EACvB,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,YAAY,GACpB,QAAQ,CAqFV"}
|
package/dist/sarif.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { TotemCompileError } from './errors.js';
|
|
2
3
|
/** Default rule category when none is specified on the compiled rule. */
|
|
3
4
|
export const DEFAULT_RULE_CATEGORY = 'architecture';
|
|
4
5
|
// ─── Builder ─────────────────────────────────────────
|
|
@@ -38,7 +39,7 @@ export function buildSarifLog(violations, rules, options) {
|
|
|
38
39
|
const results = violations.map((v) => {
|
|
39
40
|
const idx = ruleIndexMap.get(v.rule.lessonHash);
|
|
40
41
|
if (idx === undefined) {
|
|
41
|
-
throw new
|
|
42
|
+
throw new TotemCompileError(`SARIF builder: no rule index for lessonHash ${v.rule.lessonHash}`, 'This is an internal error — the compiled rules may be corrupted. Run `totem compile --force`.');
|
|
42
43
|
}
|
|
43
44
|
return {
|
|
44
45
|
ruleId: ruleId(v.rule),
|
package/dist/sarif.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"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"}
|