vemora 0.1.0-alpha.15
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 +851 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +682 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +14 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +137 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/audit.d.ts +17 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +398 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brief.d.ts +16 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +84 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/chat.d.ts +7 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +155 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/context.d.ts +63 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +794 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/dead-code.d.ts +15 -0
- package/dist/commands/dead-code.d.ts.map +1 -0
- package/dist/commands/dead-code.js +206 -0
- package/dist/commands/dead-code.js.map +1 -0
- package/dist/commands/deps.d.ts +20 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +138 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/focus.d.ts +8 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +310 -0
- package/dist/commands/focus.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +366 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init-agent.d.ts +23 -0
- package/dist/commands/init-agent.d.ts.map +1 -0
- package/dist/commands/init-agent.js +384 -0
- package/dist/commands/init-agent.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +122 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge.d.ts +14 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +115 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/plan.d.ts +24 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +867 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/query.d.ts +39 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +392 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/remember.d.ts +11 -0
- package/dist/commands/remember.d.ts.map +1 -0
- package/dist/commands/remember.js +267 -0
- package/dist/commands/remember.js.map +1 -0
- package/dist/commands/report.d.ts +10 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +243 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summarize.d.ts +14 -0
- package/dist/commands/summarize.d.ts.map +1 -0
- package/dist/commands/summarize.js +170 -0
- package/dist/commands/summarize.js.map +1 -0
- package/dist/commands/triage.d.ts +33 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +419 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/usages.d.ts +14 -0
- package/dist/commands/usages.d.ts.map +1 -0
- package/dist/commands/usages.js +236 -0
- package/dist/commands/usages.js.map +1 -0
- package/dist/core/config.d.ts +35 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +159 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/types.d.ts +287 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +26 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/noop.d.ts +17 -0
- package/dist/embeddings/noop.d.ts.map +1 -0
- package/dist/embeddings/noop.js +22 -0
- package/dist/embeddings/noop.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +11 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +49 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/openai.d.ts +10 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +67 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/provider.d.ts +19 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +3 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/indexer/callgraph.d.ts +16 -0
- package/dist/indexer/callgraph.d.ts.map +1 -0
- package/dist/indexer/callgraph.js +154 -0
- package/dist/indexer/callgraph.js.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.js +30 -0
- package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
- package/dist/indexer/chunkBySymbols.d.ts +7 -0
- package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
- package/dist/indexer/chunkBySymbols.js +57 -0
- package/dist/indexer/chunkBySymbols.js.map +1 -0
- package/dist/indexer/chunker.d.ts +15 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +26 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/classHeader.d.ts +7 -0
- package/dist/indexer/classHeader.d.ts.map +1 -0
- package/dist/indexer/classHeader.js +37 -0
- package/dist/indexer/classHeader.js.map +1 -0
- package/dist/indexer/deps.d.ts +66 -0
- package/dist/indexer/deps.d.ts.map +1 -0
- package/dist/indexer/deps.js +412 -0
- package/dist/indexer/deps.js.map +1 -0
- package/dist/indexer/hasher.d.ts +17 -0
- package/dist/indexer/hasher.d.ts.map +1 -0
- package/dist/indexer/hasher.js +38 -0
- package/dist/indexer/hasher.js.map +1 -0
- package/dist/indexer/parser.d.ts +18 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +355 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/scanner.d.ts +18 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +37 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/strategy.d.ts +11 -0
- package/dist/indexer/strategy.d.ts.map +1 -0
- package/dist/indexer/strategy.js +15 -0
- package/dist/indexer/strategy.js.map +1 -0
- package/dist/indexer/tests.d.ts +15 -0
- package/dist/indexer/tests.d.ts.map +1 -0
- package/dist/indexer/tests.js +68 -0
- package/dist/indexer/tests.js.map +1 -0
- package/dist/indexer/todos.d.ts +9 -0
- package/dist/indexer/todos.d.ts.map +1 -0
- package/dist/indexer/todos.js +29 -0
- package/dist/indexer/todos.js.map +1 -0
- package/dist/llm/anthropic.d.ts +8 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +76 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/claude-code.d.ts +37 -0
- package/dist/llm/claude-code.d.ts.map +1 -0
- package/dist/llm/claude-code.js +97 -0
- package/dist/llm/claude-code.js.map +1 -0
- package/dist/llm/factory.d.ts +7 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +47 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/ollama.d.ts +8 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +83 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai.d.ts +8 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +68 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +35 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +3 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/search/bm25.d.ts +3 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +104 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/formatter.d.ts +43 -0
- package/dist/search/formatter.d.ts.map +1 -0
- package/dist/search/formatter.js +208 -0
- package/dist/search/formatter.js.map +1 -0
- package/dist/search/hybrid.d.ts +10 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +53 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/merge.d.ts +33 -0
- package/dist/search/merge.d.ts.map +1 -0
- package/dist/search/merge.js +158 -0
- package/dist/search/merge.js.map +1 -0
- package/dist/search/mmr.d.ts +23 -0
- package/dist/search/mmr.d.ts.map +1 -0
- package/dist/search/mmr.js +95 -0
- package/dist/search/mmr.js.map +1 -0
- package/dist/search/rerank.d.ts +12 -0
- package/dist/search/rerank.d.ts.map +1 -0
- package/dist/search/rerank.js +113 -0
- package/dist/search/rerank.js.map +1 -0
- package/dist/search/signature.d.ts +42 -0
- package/dist/search/signature.d.ts.map +1 -0
- package/dist/search/signature.js +112 -0
- package/dist/search/signature.js.map +1 -0
- package/dist/search/vector.d.ts +41 -0
- package/dist/search/vector.d.ts.map +1 -0
- package/dist/search/vector.js +185 -0
- package/dist/search/vector.js.map +1 -0
- package/dist/storage/cache.d.ts +30 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +160 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/knowledge.d.ts +23 -0
- package/dist/storage/knowledge.d.ts.map +1 -0
- package/dist/storage/knowledge.js +81 -0
- package/dist/storage/knowledge.js.map +1 -0
- package/dist/storage/planSession.d.ts +39 -0
- package/dist/storage/planSession.d.ts.map +1 -0
- package/dist/storage/planSession.js +78 -0
- package/dist/storage/planSession.js.map +1 -0
- package/dist/storage/repository.d.ts +27 -0
- package/dist/storage/repository.d.ts.map +1 -0
- package/dist/storage/repository.js +95 -0
- package/dist/storage/repository.js.map +1 -0
- package/dist/storage/session.d.ts +38 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +100 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/summaries.d.ts +19 -0
- package/dist/storage/summaries.d.ts.map +1 -0
- package/dist/storage/summaries.js +66 -0
- package/dist/storage/summaries.js.map +1 -0
- package/dist/storage/usage.d.ts +39 -0
- package/dist/storage/usage.d.ts.map +1 -0
- package/dist/storage/usage.js +55 -0
- package/dist/storage/usage.js.map +1 -0
- package/dist/utils/git.d.ts +20 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +49 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +32 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +66 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,419 @@
|
|
|
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
|
+
exports.runTriage = runTriage;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const config_1 = require("../core/config");
|
|
9
|
+
const repository_1 = require("../storage/repository");
|
|
10
|
+
const SEVERITY_SCORE = { high: 3, medium: 2, low: 1 };
|
|
11
|
+
const HEURISTICS = [
|
|
12
|
+
// ── BUGS ─────────────────────────────────────────────────────────────────────
|
|
13
|
+
{
|
|
14
|
+
name: "empty-catch",
|
|
15
|
+
pattern: /catch\s*\([^)]*\)\s*\{\s*\}/,
|
|
16
|
+
multiline: true,
|
|
17
|
+
category: "Error Handling",
|
|
18
|
+
severity: "high",
|
|
19
|
+
reason: "Empty catch silently swallows errors — add logging or rethrow",
|
|
20
|
+
types: ["bugs"],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "async-foreach",
|
|
24
|
+
pattern: /\.forEach\s*\(\s*async\b/,
|
|
25
|
+
category: "Async",
|
|
26
|
+
severity: "high",
|
|
27
|
+
reason: "async callback in forEach is not awaited — errors and results are lost",
|
|
28
|
+
types: ["bugs", "performance"],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "json-parse-unguarded",
|
|
32
|
+
pattern: /\bJSON\.parse\s*\(/,
|
|
33
|
+
guardPattern: /\btry\s*\{/,
|
|
34
|
+
category: "Error Handling",
|
|
35
|
+
severity: "medium",
|
|
36
|
+
reason: "JSON.parse throws on malformed input — wrap in try/catch",
|
|
37
|
+
types: ["bugs"],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "non-null-assertion",
|
|
41
|
+
pattern: /[a-zA-Z_$][\w$]*!\.[a-zA-Z_$]/,
|
|
42
|
+
category: "Null Safety",
|
|
43
|
+
severity: "medium",
|
|
44
|
+
reason: "Non-null assertion (!) bypasses type safety and may throw at runtime",
|
|
45
|
+
types: ["bugs"],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "explicit-any",
|
|
49
|
+
pattern: /(?::\s*any\b|as\s+any\b)/,
|
|
50
|
+
category: "Type Safety",
|
|
51
|
+
severity: "low",
|
|
52
|
+
reason: "Explicit any disables type checking — potential source of hidden bugs",
|
|
53
|
+
types: ["bugs"],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "process-exit",
|
|
57
|
+
pattern: /\bprocess\.exit\s*\(/,
|
|
58
|
+
category: "Control Flow",
|
|
59
|
+
severity: "medium",
|
|
60
|
+
reason: "process.exit() terminates immediately — avoid in library/shared code",
|
|
61
|
+
types: ["bugs"],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "float-equality",
|
|
65
|
+
pattern: /(?:===|!==)\s*\d+\.\d+|\d+\.\d+\s*(?:===|!==)/,
|
|
66
|
+
category: "Float Precision",
|
|
67
|
+
severity: "low",
|
|
68
|
+
reason: "Strict equality on floating-point values may fail due to IEEE 754 rounding",
|
|
69
|
+
types: ["bugs"],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: "promise-no-catch",
|
|
73
|
+
pattern: /\bPromise\.all\s*\(|Promise\.allSettled\s*\(|Promise\.race\s*\(/,
|
|
74
|
+
category: "Async",
|
|
75
|
+
severity: "low",
|
|
76
|
+
reason: "Promise combinator — verify rejection handling is in place",
|
|
77
|
+
types: ["bugs"],
|
|
78
|
+
},
|
|
79
|
+
// ── SECURITY ──────────────────────────────────────────────────────────────────
|
|
80
|
+
{
|
|
81
|
+
name: "hardcoded-secret",
|
|
82
|
+
pattern: /(?:password|passwd|secret|api[_-]?key|token|private[_-]?key)\s*[=:]\s*['"][^'"]{4,}['"]/i,
|
|
83
|
+
category: "Hardcoded Credential",
|
|
84
|
+
severity: "high",
|
|
85
|
+
reason: "Credential hardcoded in source — rotate and move to environment variable",
|
|
86
|
+
types: ["security"],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "eval",
|
|
90
|
+
pattern: /\beval\s*\(/,
|
|
91
|
+
category: "Code Injection",
|
|
92
|
+
severity: "high",
|
|
93
|
+
reason: "eval() executes arbitrary strings — remote code execution risk",
|
|
94
|
+
types: ["security"],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: "new-function",
|
|
98
|
+
pattern: /\bnew\s+Function\s*\(/,
|
|
99
|
+
category: "Code Injection",
|
|
100
|
+
severity: "high",
|
|
101
|
+
reason: "new Function() executes arbitrary code — equivalent risk to eval()",
|
|
102
|
+
types: ["security"],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: "weak-hash",
|
|
106
|
+
pattern: /createHash\s*\(\s*['"](?:md5|sha1)['"]\s*\)/,
|
|
107
|
+
category: "Weak Cryptography",
|
|
108
|
+
severity: "high",
|
|
109
|
+
reason: "MD5/SHA1 are cryptographically broken — use SHA-256 or stronger",
|
|
110
|
+
types: ["security"],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: "inner-html",
|
|
114
|
+
pattern: /\.(innerHTML|outerHTML)\s*=/,
|
|
115
|
+
category: "XSS",
|
|
116
|
+
severity: "high",
|
|
117
|
+
reason: "Assigning to innerHTML/outerHTML with untrusted input causes XSS",
|
|
118
|
+
types: ["security"],
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: "sensitive-log",
|
|
122
|
+
pattern: /console\.\w+\s*\([^)]*(?:password|token|secret|apikey|api_key)/i,
|
|
123
|
+
category: "Information Disclosure",
|
|
124
|
+
severity: "high",
|
|
125
|
+
reason: "Sensitive value written to logs — may be captured by aggregators",
|
|
126
|
+
types: ["security"],
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: "shell-exec",
|
|
130
|
+
pattern: /\bexec(?:Sync)?\s*\(|child_process\b/,
|
|
131
|
+
category: "Command Injection",
|
|
132
|
+
severity: "medium",
|
|
133
|
+
reason: "Shell execution — verify that input is not user-controlled",
|
|
134
|
+
types: ["security"],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: "http-url",
|
|
138
|
+
pattern: /['"]http:\/\/(?!localhost|127\.0\.0\.1|0\.0\.0\.0)/,
|
|
139
|
+
category: "Transport Security",
|
|
140
|
+
severity: "medium",
|
|
141
|
+
reason: "Plaintext HTTP to external host — use HTTPS",
|
|
142
|
+
types: ["security"],
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: "math-random-security",
|
|
146
|
+
pattern: /Math\.random\s*\(\s*\)/,
|
|
147
|
+
category: "Weak Randomness",
|
|
148
|
+
severity: "low",
|
|
149
|
+
reason: "Math.random() is not cryptographically secure — use crypto.randomBytes() for security-sensitive contexts",
|
|
150
|
+
types: ["security"],
|
|
151
|
+
},
|
|
152
|
+
// ── PERFORMANCE ───────────────────────────────────────────────────────────────
|
|
153
|
+
{
|
|
154
|
+
// High: sync I/O inside a loop — genuinely blocks the event loop on every iteration.
|
|
155
|
+
// requirePattern ensures this only fires when a loop construct is present in the chunk.
|
|
156
|
+
// guardPattern on `sync-io` (below) deduplicates: that heuristic won't fire on the
|
|
157
|
+
// same chunks where a loop is present.
|
|
158
|
+
name: "sync-io-in-loop",
|
|
159
|
+
pattern: /\b(?:readFileSync|writeFileSync|appendFileSync|statSync|readdirSync|rmSync|unlinkSync|copyFileSync|renameSync)\s*\(/,
|
|
160
|
+
requirePattern: /\b(?:for\s*\(|while\s*\(|\.forEach\s*\(|\.map\s*\(|\.flatMap\s*\(|\.reduce\s*\(|\.filter\s*\(|\.find\s*\()\b/,
|
|
161
|
+
category: "Synchronous I/O in Loop",
|
|
162
|
+
severity: "high",
|
|
163
|
+
reason: "Synchronous filesystem call inside a loop — blocks the event loop on every iteration",
|
|
164
|
+
types: ["performance"],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
// Low: sync I/O outside a loop — often acceptable in CLI/setup code.
|
|
168
|
+
// guardPattern suppresses this when a loop is present (sync-io-in-loop covers that case).
|
|
169
|
+
name: "sync-io",
|
|
170
|
+
pattern: /\b(?:readFileSync|writeFileSync|appendFileSync|existsSync|statSync|readdirSync|mkdirSync|rmSync|unlinkSync|copyFileSync|renameSync)\s*\(/,
|
|
171
|
+
guardPattern: /\b(?:for\s*\(|while\s*\(|\.forEach\s*\(|\.map\s*\(|\.flatMap\s*\(|\.reduce\s*\(|\.filter\s*\(|\.find\s*\()\b/,
|
|
172
|
+
category: "Synchronous I/O",
|
|
173
|
+
severity: "low",
|
|
174
|
+
reason: "Synchronous filesystem call — acceptable in CLI/setup code, avoid in server hot paths or loops",
|
|
175
|
+
types: ["performance"],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: "json-roundtrip",
|
|
179
|
+
pattern: /JSON\.parse\s*\(\s*JSON\.stringify\s*\(/,
|
|
180
|
+
category: "Unnecessary Serialization",
|
|
181
|
+
severity: "medium",
|
|
182
|
+
reason: "JSON roundtrip for deep clone is slow — use structuredClone() instead",
|
|
183
|
+
types: ["performance"],
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: "filter-map-chain",
|
|
187
|
+
pattern: /\.filter\s*\([^)]+\)\s*\.map\s*\(/,
|
|
188
|
+
category: "Redundant Iteration",
|
|
189
|
+
severity: "low",
|
|
190
|
+
reason: ".filter().map() iterates twice — consider .flatMap() or a single .reduce()",
|
|
191
|
+
types: ["performance"],
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: "runtime-regex",
|
|
195
|
+
pattern: /\bnew\s+RegExp\s*\(/,
|
|
196
|
+
category: "Redundant Computation",
|
|
197
|
+
severity: "medium",
|
|
198
|
+
reason: "RegExp compiled at runtime — hoist to module scope if used in a loop",
|
|
199
|
+
types: ["performance"],
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
name: "array-find-linear",
|
|
203
|
+
pattern: /\bObject\.keys\s*\([^)]+\)\s*\.(?:find|filter|forEach|map)\s*\(/,
|
|
204
|
+
category: "Redundant Iteration",
|
|
205
|
+
severity: "low",
|
|
206
|
+
reason: "Object.keys() + iteration on hot path — consider using a Map for O(1) lookup",
|
|
207
|
+
types: ["performance"],
|
|
208
|
+
},
|
|
209
|
+
];
|
|
210
|
+
// ─── Analysis ─────────────────────────────────────────────────────────────────
|
|
211
|
+
function shouldSkipFile(filePath) {
|
|
212
|
+
// Test / mock infrastructure — too many intentional patterns
|
|
213
|
+
if (/\.(test|spec)\.[jt]sx?$/.test(filePath) ||
|
|
214
|
+
filePath.includes("__tests__") ||
|
|
215
|
+
filePath.includes("/__mocks__/") ||
|
|
216
|
+
filePath.includes("/fixtures/"))
|
|
217
|
+
return true;
|
|
218
|
+
// Documentation and config files — pattern matches are almost always prose
|
|
219
|
+
if (/\.(md|mdx|txt|rst|adoc)$/.test(filePath))
|
|
220
|
+
return true;
|
|
221
|
+
if (/\.(json|yaml|yml|toml|ini|env)$/.test(filePath))
|
|
222
|
+
return true;
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
/** Returns true for lines that are purely comments and should not be scanned. */
|
|
226
|
+
function isCommentLine(line) {
|
|
227
|
+
const t = line.trim();
|
|
228
|
+
return (t.startsWith("//") || // single-line JS/TS/Go/Rust/Java comment
|
|
229
|
+
t.startsWith("*") || // JSDoc / block comment body
|
|
230
|
+
t.startsWith("/*") || // block comment open
|
|
231
|
+
t.startsWith("#") || // Python / shell / TOML comment
|
|
232
|
+
t.startsWith("<!--") // HTML / markdown comment
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
function analyzeChunk(chunk, heuristics) {
|
|
236
|
+
const matches = [];
|
|
237
|
+
const lines = chunk.content.split("\n");
|
|
238
|
+
// Pre-compute which lines are comments so we skip them consistently
|
|
239
|
+
const commentMask = lines.map(isCommentLine);
|
|
240
|
+
// Build a comment-stripped version of the chunk for guard-pattern and
|
|
241
|
+
// multi-line fallback checks — avoids guard/pattern matches inside comments.
|
|
242
|
+
const strippedContent = lines
|
|
243
|
+
.filter((_, i) => !commentMask[i])
|
|
244
|
+
.join("\n");
|
|
245
|
+
const seen = new Set();
|
|
246
|
+
for (const h of heuristics) {
|
|
247
|
+
if (seen.has(h.name))
|
|
248
|
+
continue;
|
|
249
|
+
// guardPattern: if present and matches, the finding is suppressed (call is guarded).
|
|
250
|
+
if (h.guardPattern?.test(strippedContent))
|
|
251
|
+
continue;
|
|
252
|
+
// requirePattern: if present and does NOT match, the finding is suppressed
|
|
253
|
+
// (required context is absent — e.g. no loop present for sync-io-in-loop).
|
|
254
|
+
if (h.requirePattern && !h.requirePattern.test(strippedContent))
|
|
255
|
+
continue;
|
|
256
|
+
// Per-line matching — gives accurate absolute line numbers.
|
|
257
|
+
// Comment lines are skipped so patterns in prose/JSDoc don't trigger.
|
|
258
|
+
let found = false;
|
|
259
|
+
for (let i = 0; i < lines.length; i++) {
|
|
260
|
+
if (commentMask[i])
|
|
261
|
+
continue;
|
|
262
|
+
if (h.pattern.test(lines[i])) {
|
|
263
|
+
seen.add(h.name);
|
|
264
|
+
matches.push({
|
|
265
|
+
heuristic: h.name,
|
|
266
|
+
category: h.category,
|
|
267
|
+
severity: h.severity,
|
|
268
|
+
reason: h.reason,
|
|
269
|
+
line: chunk.start + i,
|
|
270
|
+
snippet: lines[i].trim().slice(0, 120),
|
|
271
|
+
});
|
|
272
|
+
found = true;
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Multi-line fallback for patterns that genuinely span lines.
|
|
277
|
+
// multiline:true → raw content (empty-catch: a comment-only body IS a bug)
|
|
278
|
+
// multiline:false → strippedContent (avoids matching patterns inside JSDoc)
|
|
279
|
+
const fallbackContent = h.multiline ? chunk.content : strippedContent;
|
|
280
|
+
if (!found && h.pattern.test(fallbackContent)) {
|
|
281
|
+
seen.add(h.name);
|
|
282
|
+
matches.push({
|
|
283
|
+
heuristic: h.name,
|
|
284
|
+
category: h.category,
|
|
285
|
+
severity: h.severity,
|
|
286
|
+
reason: h.reason,
|
|
287
|
+
line: chunk.start,
|
|
288
|
+
snippet: chunk.content.trim().slice(0, 120),
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return matches;
|
|
293
|
+
}
|
|
294
|
+
// ─── Formatters ───────────────────────────────────────────────────────────────
|
|
295
|
+
const SEV_STYLE = {
|
|
296
|
+
high: (s) => chalk_1.default.red.bold(s),
|
|
297
|
+
medium: (s) => chalk_1.default.yellow(s),
|
|
298
|
+
low: (s) => chalk_1.default.gray(s),
|
|
299
|
+
};
|
|
300
|
+
function formatTerminal(findings, types) {
|
|
301
|
+
const totalMatches = findings.reduce((n, f) => n + f.matches.length, 0);
|
|
302
|
+
console.log(chalk_1.default.bold.cyan(`\n── vemora triage [${types.join(", ")}] ──────────────────────────`));
|
|
303
|
+
console.log(chalk_1.default.gray(` ${findings.length} chunk(s) flagged · ${totalMatches} pattern match(es)\n`));
|
|
304
|
+
if (findings.length === 0) {
|
|
305
|
+
console.log(chalk_1.default.green(" No issues found.\n"));
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
for (const f of findings) {
|
|
309
|
+
const scoreLabel = chalk_1.default.bold(`score ${f.score}`);
|
|
310
|
+
const symbolLabel = f.symbol ? chalk_1.default.gray(` [${f.symbol}]`) : "";
|
|
311
|
+
console.log(`${chalk_1.default.bold.white(f.file)}:${chalk_1.default.cyan(String(f.startLine))}–${f.endLine}${symbolLabel} ${scoreLabel}`);
|
|
312
|
+
for (const m of f.matches) {
|
|
313
|
+
const sev = SEV_STYLE[m.severity](`[${m.severity}]`);
|
|
314
|
+
console.log(` ${sev} ${chalk_1.default.bold(m.category)} ${chalk_1.default.gray(`line ${m.line}`)}`);
|
|
315
|
+
console.log(` ${m.reason}`);
|
|
316
|
+
if (m.snippet)
|
|
317
|
+
console.log(chalk_1.default.gray(` > ${m.snippet}`));
|
|
318
|
+
}
|
|
319
|
+
console.log();
|
|
320
|
+
}
|
|
321
|
+
const bySev = { high: 0, medium: 0, low: 0 };
|
|
322
|
+
for (const f of findings) {
|
|
323
|
+
for (const m of f.matches)
|
|
324
|
+
bySev[m.severity]++;
|
|
325
|
+
}
|
|
326
|
+
const summary = ["high", "medium", "low"]
|
|
327
|
+
.filter((s) => bySev[s] > 0)
|
|
328
|
+
.map((s) => SEV_STYLE[s](`${bySev[s]} ${s}`))
|
|
329
|
+
.join(chalk_1.default.gray(" · "));
|
|
330
|
+
console.log(chalk_1.default.bold.cyan("────────────────────────────────────────────────────────────"));
|
|
331
|
+
console.log(` ${summary || chalk_1.default.green("0 issues")}`);
|
|
332
|
+
console.log();
|
|
333
|
+
}
|
|
334
|
+
function formatMarkdown(findings, types) {
|
|
335
|
+
const totalMatches = findings.reduce((n, f) => n + f.matches.length, 0);
|
|
336
|
+
const lines = [
|
|
337
|
+
`# Triage Report — ${types.join(", ")}`,
|
|
338
|
+
"",
|
|
339
|
+
`**Chunks flagged:** ${findings.length} **Pattern matches:** ${totalMatches}`,
|
|
340
|
+
"",
|
|
341
|
+
];
|
|
342
|
+
if (findings.length === 0) {
|
|
343
|
+
lines.push("No issues found.");
|
|
344
|
+
return lines.join("\n");
|
|
345
|
+
}
|
|
346
|
+
const bySev = {};
|
|
347
|
+
for (const f of findings) {
|
|
348
|
+
const topSev = f.matches.reduce((best, m) => (SEVERITY_SCORE[m.severity] > SEVERITY_SCORE[best] ? m.severity : best), "low");
|
|
349
|
+
(bySev[topSev] ??= []).push(f);
|
|
350
|
+
}
|
|
351
|
+
for (const sev of ["high", "medium", "low"]) {
|
|
352
|
+
const group = bySev[sev];
|
|
353
|
+
if (!group?.length)
|
|
354
|
+
continue;
|
|
355
|
+
lines.push(`## ${sev.charAt(0).toUpperCase() + sev.slice(1)} (${group.length})`);
|
|
356
|
+
lines.push("");
|
|
357
|
+
for (const f of group) {
|
|
358
|
+
const loc = f.symbol ? `${f.file}:${f.startLine} — ${f.symbol}` : `${f.file}:${f.startLine}`;
|
|
359
|
+
lines.push(`### \`${loc}\``);
|
|
360
|
+
for (const m of f.matches) {
|
|
361
|
+
lines.push(`- **[${m.severity}] ${m.category}** (line ${m.line}): ${m.reason}`);
|
|
362
|
+
if (m.snippet)
|
|
363
|
+
lines.push(` \`${m.snippet}\``);
|
|
364
|
+
}
|
|
365
|
+
lines.push("");
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return lines.join("\n");
|
|
369
|
+
}
|
|
370
|
+
// ─── Main command ─────────────────────────────────────────────────────────────
|
|
371
|
+
async function runTriage(rootDir, options = {}) {
|
|
372
|
+
(0, config_1.loadConfig)(rootDir); // validates config exists
|
|
373
|
+
const repo = new repository_1.RepositoryStorage(rootDir);
|
|
374
|
+
const chunks = repo.loadChunks();
|
|
375
|
+
if (chunks.length === 0) {
|
|
376
|
+
console.error(chalk_1.default.red("No index found. Run `vemora index` first."));
|
|
377
|
+
process.exit(1);
|
|
378
|
+
}
|
|
379
|
+
const types = options.types ?? ["bugs", "security", "performance"];
|
|
380
|
+
const topK = options.topK ?? 30;
|
|
381
|
+
const minScore = options.minScore ?? 1;
|
|
382
|
+
const output = options.output ?? "terminal";
|
|
383
|
+
// Deduplicate heuristics by name (async-foreach appears in both bugs and performance)
|
|
384
|
+
const applicable = HEURISTICS.filter((h) => h.types.some((t) => types.includes(t)));
|
|
385
|
+
const deduped = [...new Map(applicable.map((h) => [h.name, h])).values()];
|
|
386
|
+
// Filter by file substring if requested, and always skip test/mock files
|
|
387
|
+
let targets = chunks.filter((c) => !shouldSkipFile(c.file));
|
|
388
|
+
if (options.file) {
|
|
389
|
+
const needle = options.file.toLowerCase();
|
|
390
|
+
targets = targets.filter((c) => c.file.toLowerCase().includes(needle));
|
|
391
|
+
if (targets.length === 0) {
|
|
392
|
+
console.error(chalk_1.default.red(`No indexed chunks found for file filter: "${options.file}"`));
|
|
393
|
+
process.exit(1);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// Analyze
|
|
397
|
+
const findings = [];
|
|
398
|
+
for (const chunk of targets) {
|
|
399
|
+
const matches = analyzeChunk(chunk, deduped);
|
|
400
|
+
if (matches.length === 0)
|
|
401
|
+
continue;
|
|
402
|
+
const score = matches.reduce((sum, m) => sum + SEVERITY_SCORE[m.severity], 0);
|
|
403
|
+
if (score < minScore)
|
|
404
|
+
continue;
|
|
405
|
+
findings.push({ file: chunk.file, startLine: chunk.start, endLine: chunk.end, symbol: chunk.symbol, score, matches });
|
|
406
|
+
}
|
|
407
|
+
// Sort by score descending, slice to topK
|
|
408
|
+
const sorted = findings.sort((a, b) => b.score - a.score).slice(0, topK);
|
|
409
|
+
if (output === "json") {
|
|
410
|
+
console.log(JSON.stringify({ types, findings: sorted }, null, 2));
|
|
411
|
+
}
|
|
412
|
+
else if (output === "markdown") {
|
|
413
|
+
console.log(formatMarkdown(sorted, types));
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
formatTerminal(sorted, types);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/commands/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface UsagesOptions {
|
|
2
|
+
/** Max re-export chain depth to follow (default: 10) */
|
|
3
|
+
depth?: number;
|
|
4
|
+
/** Show only files that actually call the symbol (require call graph data) */
|
|
5
|
+
callersOnly?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* vemora usages <SymbolName>
|
|
9
|
+
*
|
|
10
|
+
* Finds all files that use a named symbol, following re-export chains.
|
|
11
|
+
* Uses both the dependency graph (reliable) and the call graph (line-level detail).
|
|
12
|
+
*/
|
|
13
|
+
export declare function runUsages(rootDir: string, symbolName: string, options?: UsagesOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=usages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usages.d.ts","sourceRoot":"","sources":["../../src/commands/usages.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAWD;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA0Rf"}
|